Tham khảo tài liệu ''giáo trình phân tích ứng dụng nguyên lý thuật toán hiệu chỉnh trong đường chạy lập trình p5'', công nghệ thông tin, kỹ thuật lập trình phục vụ nhu cầu học tập, nghiên cứu và làm việc hiệu quả
O W w N y bu to c DataTemp2 Haøm trả giá trị chiều dài đường chạy tự nhiên tập tin liệu DataFile việc phân phối hoàn tất, trường hợp ngược lại hàm trả giá trị –1 int FileNaturalMerge(char * DataTemp1, char * DataTemp2, char * DataFile); Hàm thực việc trộn cặp tương ứng đường chạy tự nhiên hai tập tin tạm thời có tên DataTemp1, DataTemp2 tập tin liệu ban đầu có tên DataFile thành đường chạy có chiều tổng chiều dài đường chạy đem trộn Hàm trả chiều dài đường chạy tự nhiên sau trộn tập tin DataFile việc trộn hoàn tất, trường hợp ngược lại hàm trả giá trị –1 Nội dung hàm sau: int FileNaturalDistribute(char * DataFile, char * DataTemp1, char * DataTemp2) { FILE * Fd = fopen(DataFile, “rb”); if (Fd == NULL) return (-1); FILE * Ft1 = fopen(DataTemp1, “wb”); if (Ft1 == NULL) return (Finished (Fd, -1)); FILE * Ft2 = fopen(DataTemp2, “wb”); if (Ft2 == NULL) return (Finished (Fd, Ft1, -1)); T a, b; int SOT = sizeof(T); int L = 0, FirstRun1 = 1; if (fread(&a, SOT, 1, Fd) < 1) { if (feof(Fd)) return (Finished(Fd, Ft1, Ft2, 0)); return (Finished (Fd, Ft1, Ft2, -1)); } while (!feof(Fd)) { { int t = fwrite(&a, SOT, 1, Ft1); if (t < 1) return (Finished (Fd, Ft1, Ft2, -1)); if (FirstRun1 == 1) L++; t = fread(&b, SOT, 1, Fd); if (t < 1) { if (feof(Fd)) break; return (Finished (Fd, Ft1, Ft2, -1)); } if (a > b) { a = b; break; } a = b; } Trang: 73 w d o m C lic k Giáo trình: Cấu Trúc Dữ Liệu Giải Thuật o o c u -tr a c k w w d o m C lic k to bu y N w w w h a n g e Vi e ! XC er O W F- w PD h a n g e Vi e ! XC er PD F- c u -tr a c k c O W N y bu k lic } return (Finished (Fd, Ft1, Ft2, L); } //======================================================== int FileNaturalMerge(char * DataTemp1, char * DataTemp2, char * DataFile) { FILE * Fd = fopen(DataFile, "wb"); if(Fd == NULL) return(-1); FILE * Ft1 = fopen(DataTemp1, "rb"); if(Ft1 == NULL) return(Finished(Fd, -1)); FILE * Ft2 = fopen(DataTemp2, "rb"); if(Ft2 == NULL) return(Finished(Fd, Ft1, -1)); int a1, a2, b1, b2; if (fread(&a1, SOT, 1, Ft1) < 1) return(Finished(Fd, Ft1, Ft2, -1)); if (fread(&a2, SOT, 1, Ft2) < 1) return(Finished(Fd, Ft1, Ft2, -1)); int L = 0; int FirstRun1 = 1, FirstRun2 = 1; while(!feof(Ft1) && !feof(Ft2)) { if (a1 b) { a = b; FirstRun1 = 0; break; } a = b; } while (1); o m o c C k Giáo trình: Cấu Trúc Dữ Liệu Giải Thuật lic C c u -tr a c k w w d o w to to bu y N w w w h a n g e Vi e ! XC er O W F- w PD h a n g e Vi e ! XC er PD F- c u -tr a c k c O W w N y bu to c w L++; t = fread(&b1, SOT, 1, Ft1); if (t < 1) { if (feof(Ft1)) break; return(Finished(Fd, Ft1, Ft2, -1)); } if (a1 > b1) { { t = fwrite(&a2, SOT, 1, Fd); if (t < 1) return(Finished(Fd, Ft1, Ft2, -1)); if (FirstRun2 == 1) L++; t = fread(&b2, SOT, 1, Ft2); if (t < 1) { if (feof(Ft2)) { FirstRun2 = 0; break; } return(Finished(Fd, Ft1, Ft2, -1)); } if (a2 > b2) { FirstRun2 = 0; a2 = b2; break; } } while(1); a1 = b1; FirstRun1 = 0; if (feof(Ft2)) break; } a1 = b1; } else { int t = fwrite(&a2, SOT, 1, Fd); if (t < 1) return(Finished(Fd, Ft1, Ft2, -1)); if (FirstRun2 == 1) L++; t = fread(&b2, SOT, 1, Ft2); if (t < 1) { if (feof(Ft2)) break; return(Finished(Fd, Ft1, Ft2, -1)); } if (a2 > b2) Trang: 75 d o m C lic k Giáo trình: Cấu Trúc Dữ Liệu Giải Thuaät o o c u -tr a c k w w d o m C lic k to bu y N w w w h a n g e Vi e ! XC er O W F- w PD h a n g e Vi e ! XC er PD F- c u -tr a c k c O W w N y bu to c w { { t = fwrite(&a1, SOT, 1, Fd); if (t < 1) return(Finished(Fd, Ft1, Ft2, -1)); if (Fr1 == 1) L++; t = fread(&b1, SOT, 1, Ft1); if (t < 1) { if (feof(Ft1)) { FirstRun1 = 0; break; } return(Finished(Fd, Ft1, Ft2, -1)); } if (a1 > b1) { FirstRun1 = 0; a1 = b1; break; } } while(1); a2 = b2; FirstRun2 = 0; if (feof(Ft1)) break; } a2 = b2; } } while(!feof(Ft1)) { int t = fwrite(&a1, SOT, 1, Fd); if (t < 1) return(Finished(Fd, Ft1, Ft2, -1)); if (FirstRun1 == 1) L++; t = fread(&a1, SOT, 1, Ft1); if (t < 1) { if (feof(Ft1)) break; return(Finished(Fd, Ft1, Ft2, -1)); } } while(!feof(Ft2)) { int t = fwrite(&a2, SOT, 1, Fd); if (t < 1) return(Finished(Fd, Ft1, Ft2, -1)); if (FirstRun2 == 1) L++; t = fread(&a2, SOT, 1, Ft2); Trang: 76 d o m C lic k Giáo trình: Cấu Trúc Dữ Liệu Giải Thuaät o o c u -tr a c k w w d o m C lic k to bu y N w w w h a n g e Vi e ! XC er O W F- w PD h a n g e Vi e ! XC er PD F- c u -tr a c k c O W N y bu k lic } return(Finished(Fd, Ft1, Ft2, L)); } //======================================================== int FileNaturalMergeSort(char * DataFile) { int Fhd = open(DataFile, O_RDONLY); if (Fhd < 0) return (-1); int N = filelength(Fhd)/sizeof(T); close (Fhd); if (N < 2) return (1); char * Temp1 = “Data1.Tmp”; char * Temp2 = “Data2.Tmp”; int L = 0; do{ L = FileNaturalDistribute(DataFile, Temp1, Temp2); if (L == -1) { remove(Temp1); remove(Temp2); return (-1); } if (L == N) break; L = FileNaturalMerge(Temp1, Temp2, DataFile); if (L == -1) { remove(Temp1); remove(Temp2); return (-1); } if (L == N) break; } while (L < N); remove(Temp1); remove(Temp2); return (1); } - Ví dụ minh họa thuật toán xếp trộn tự nhiên: Giả sử liệu ban đầu tập tin Fd sau: 80 24 12 11 2 15 10 35 35 18 Ta tiến hành phân phối trộn đường chạy tự nhiên: Trang: 77 d o m w if (t < 1) { if (feof(Ft2)) break; return(Finished(Fd, Ft1, Ft2, -1)); } o m o c C k Giáo trình: Cấu Trúc Dữ Liệu Giải Thuaät lic C c u -tr a c k w w d o w to to bu y N w w w h a n g e Vi e ! XC er O W F- w PD h a n g e Vi e ! XC er PD F- c u -tr a c k c ... return (1); } - Ví dụ minh họa thuật toán xếp trộn tự nhiên: Giả sử liệu ban đầu tập tin Fd sau: 80 24 12 11 2 15 10 35 35 18 Ta tiến hành phân phối trộn đường chạy tự nhiên: Trang: 77 d o m... if (FirstRun2 == 1) L++; t = fread(&a2, SOT, 1, Ft2); Trang: 76 d o m C lic k Giáo trình: Cấu Trúc Dữ Liệu Giải Thuật o o c u -tr a c k w w d o m C lic k to bu y N w w w h a n g e Vi e ! XC... break; return(Finished(Fd, Ft1, Ft2, -1)); } if (a2 > b2) Trang: 75 d o m C lic k Giáo trình: Cấu Trúc Dữ Liệu Giải Thuật o o c u -tr a c k w w d o m C lic k to bu y N w w w h a n g e Vi e ! XC