Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật Trang: 73 DataTemp2. Hàm trả về giá trò là chiều dài của đường chạy tự nhiên đầu tiên trong tập tin dữ liệu DataFile nếu việc phân phối hoàn tất, trong trường hợp ngược lại hàm trả về giá trò –1. int FileNaturalMerge(char * DataTemp1, char * DataTemp2, char * DataFile); Hàm thực hiện việc trộn từng cặp tương ứng các đường chạy tự nhiên trên hai tập tin tạm thời có tên DataTemp1, DataTemp2 về tập tin dữ liệu ban đầu có tên DataFile thành các đường chạy có chiều bằng tổng chiều dài 2 đường chạy đem trộn. Hàm trả về chiều dài của đường chạy tự nhiên đầu tiên sau khi trộn trên tập tin DataFile nếu việc trộn hoàn tất, trong trường hợp ngược lại hàm trả về giá trò –1. Nội dung của các hàm như 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)) { do { 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; } Click to buy NOW! P D F - X C h a n g e V i e w e r w w w . d o c u - t r a c k . c o m Click to buy NOW! P D F - X C h a n g e V i e w e r w w w . d o c u - t r a c k . c o m . Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật Trang: 74 while (1); if (feof(Fd)) break; do { int t = fwrite(&a, SOT, 1, Ft2); if (t < 1) return (Finished (Fd, Ft1, Ft2, -1)); t = fread(&b, SOT, 1, Fd); if (t < 1) { if (feof(Fd)) break; return (Finished (Fd, Ft1, Ft2, -1)); } if (a > b) { a = b; FirstRun1 = 0; break; } a = b; } while (1); } 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 <= a2) { int t = fwrite(&a1, SOT, 1, Fd); if (t < 1) return(Finished(Fd, Ft1, Ft2, -1)); if (FirsRun1 == 1) Click to buy NOW! P D F - X C h a n g e V i e w e r w w w . d o c u - t r a c k . c o m Click to buy NOW! P D F - X C h a n g e V i e w e r w w w . d o c u - t r a c k . c o m . Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật Trang: 75 L++; t = fread(&b1, SOT, 1, Ft1); if (t < 1) { if (feof(Ft1)) break; return(Finished(Fd, Ft1, Ft2, -1)); } if (a1 > b1) { do { 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) Click to buy NOW! P D F - X C h a n g e V i e w e r w w w . d o c u - t r a c k . c o m Click to buy NOW! P D F - X C h a n g e V i e w e r w w w . d o c u - t r a c k . c o m . Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật Trang: 76 { do { 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); Click to buy NOW! P D F - X C h a n g e V i e w e r w w w . d o c u - t r a c k . c o m Click to buy NOW! P D F - X C h a n g e V i e w e r w w w . d o c u - t r a c k . c o m . Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật Trang: 77 if (t < 1) { if (feof(Ft2)) break; return(Finished(Fd, Ft1, Ft2, -1)); } } 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 sắp xếp trộn tự nhiên: Giả sử dữ liệu ban đầu trên tập tin Fd như sau: 80 24 5 12 11 2 2 15 10 35 35 18 4 1 6 Ta tiến hành phân phối và trộn các đường chạy tự nhiên: Click to buy NOW! P D F - X C h a n g e V i e w e r w w w . d o c u - t r a c k . c o m Click to buy NOW! P D F - X C h a n g e V i e w e r w w w . d o c u - t r a c k . c o m . . Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật Trang: 73 DataTemp2. Hàm trả về giá trò là chiều dài của đường chạy tự nhiên đầu tiên trong tập tin dữ liệu DataFile nếu việc phân phối. thành các đường chạy có chiều bằng tổng chiều dài 2 đường chạy đem trộn. Hàm trả về chiều dài của đường chạy tự nhiên đầu tiên sau khi trộn trên tập tin DataFile nếu việc trộn hoàn tất, trong trường. dụ minh họa thuật toán sắp xếp trộn tự nhiên: Giả sử dữ liệu ban đầu trên tập tin Fd như sau: 80 24 5 12 11 2 2 15 10 35 35 18 4 1 6 Ta tiến hành phân phối và trộn các đường chạy tự nhiên: