Tham khảo tài liệu ''giáo trình phân tích khả năng sử dụng thuật toán hiệu chỉnh trong đường chạy lập trình p3'', 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 N y bu k lic B17: IF (K1 > L) //Đã chép hết phần run lại Ft1 Fd Lặp lại B6 B18: fwrite(&a1, sizeof(T), 1, Fd) B19: K1++ B20: IF (feof(Ft1)) //Đã chép hết phần tử Ft1 Thực B23 B21: fread(&a1, sizeof(T), 1, Ft1) B22: Lặp lại B17 //Chép phần tử lại Ft2 Fd B23: fwrite(&a2, sizeof(T), 1, Fd) B24: IF (feof(Ft2)) Thực Bkt B25: fread(&a2, sizeof(T), 1, Ft2) B26: Lặp lại B23 //Chép phần tử lại Ft1 Fd B27: fwrite(&a1, sizeof(T), 1, Fd) B28: IF (feof(Ft1)) Thực Bkt B29: fread(&a1, sizeof(T), 1, Ft1) B30: Lặp lại B27 Bkt: Kết thúc - Thuật toán xếp trộn thẳng: B1: L = //Chiều dài ban đầu run B2: IF (L ≥ N) //Tập tin Fd 01 run Thực Bkt B3: Phân_Phối(DataFile, DataTemp1, DataTemp2, L) B4: Trộn(DataTemp1, DataTemp2, DataFile, L) B5: L = 2*L B6: Lặp lại B2 Bkt: Kết thúc - Cài đặt thuật toán: Hàm FileStraightMergeSort có prototype sau: int FileStraightMergeSort(char * DataFile); Hàm thực việc xếp phần tử có kiểu liệu T tập tin có tên DataFile theo thứ tự tăng dựa thuật toán trộn trực tiếp Nếu việc xếp thành công hàm trả giá trị 1, trường hợp ngược lại (do có lỗi thực thao tác tập tin) hàm trả giá trị –1 Hàm sử dụng hàm FileDistribute, FileMerge có prototype ý nghóa sau: int FileDistribute(char * DataFile, char * DataTemp1, char * DataTemp2, int L); Hàm thực việc phân phối luân phiên đường chạy có chiều dài L tập tin liệu có tên DataFile cho tập tin tạm thời có tên tương ứng DataTemp1 Trang: 63 d o m w //Chép phần run lại Ft1 Fd 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 DataTemp2 Hàm trả giá trị 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 FileMerge(char * DataTemp1, char * DataTemp2, char * DataFile, int L); Hàm thực việc trộn cặp tương ứng đường chạy với độ dài L 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 dài 2*L Hàm trả giá trị việc trộn hoàn tất, trường hợp ngược lại hàm trả giá trị –1 Cả hai hàm sử dụng hàm Finished để làm nhiệm vụ “dọn dẹp” (đóng tập tin mở, hủy vùng nhớ cấp phát, …) trả giá trị nguyên để kết thúc Các hàm Finished có prototype sau: int Finished (FILE * F1, int ReturnValue); int Finished (FILE * F1, FILE * F2, int ReturnValue); int Finished (FILE * F1, FILE * F2, FILE * F3, int ReturnValue); Nội dung hàm sau: int Finished (FILE * F1, int ReturnValue) { fclose (F1); return (ReturnValue); } //======================================================== int Finished (FILE * F1, FILE * F2, int ReturnValue) { fclose (F1); fclose (F2); return (ReturnValue); } //======================================================== int Finished (FILE * F1, FILE * F2, FILE * F3, int ReturnValue); { fclose (F1); fclose (F2); fclose (F3); return (ReturnValue); } //======================================================== int FileDistribute(char * DataFile, char * DataTemp1, char * DataTemp2, int L) { 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; Trang: 64 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 } //======================================================== int FileMerge(char * DataTemp1, char * DataTemp2, char * DataFile, int L) { FILE * Ft1 = fopen(DataTemp1, “rb”); if (Ft1 == NULL) return (-1); FILE * Ft2 = fopen(DataTemp2, “rb”); if (Ft2 == NULL) return (Finished(Ft1, -1); FILE * Fd = fopen(DataFile, “wb”); if (Fd == NULL) return (Finished(Ft1, Ft2, -1); int K1 = 0, K2 = 0; T a1, a2; int SOT = sizeof(T); 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)); while (!feof(Ft1) && !feof(Ft2)) { if (a1