外部排序方法代码:归并排序,直接归并排序,文件的快速排序
归并排序
文本文件 sort1.txt 的内容如下:
1456
文本文件 sort2.txt 的内容如下:
2378
是用归并排序将上述两文件归并输出到文件 result.txt
1 #include <stdio.h> 2 #define LEN 4 3 4 void merge(FILE* merge,FILE* sort1,FILE* sort2,int len) 5 { 6 int s1,s2; 7 char c,c1,c2; 8 9 c1 = getc(sort1); 10 c2 = getc(sort2); 11 s1 = s2 = 0; 12 while(1) 13 { 14 if(c1 < c2) 15 { 16 putc(c1,merge); 17 s1++; 18 if(s1 < len) 19 c1 = getc(sort1); 20 else 21 break; 22 } 23 else 24 { 25 putc(c2,merge); 26 s2++; 27 if(s2 < len) 28 c2 = getc(sort2); 29 else 30 break; 31 } 32 } 33 if(s1 < len) 34 { 35 putc(c1,merge); 36 s1++; 37 } 38 if(s2 < len) 39 { 40 putc(c2,merge); 41 s2++; 42 } 43 while(s1 < len) 44 { 45 c = getc(sort1); 46 putc(c,merge); 47 s1++; 48 } 49 while(s2 < len) 50 { 51 c = getc(sort2); 52 putc(c,merge); 53 s2++; 54 } 55 } 56 57 int main() 58 { 59 FILE* fp; 60 FILE* fp1; 61 FILE* fp2; 62 fp = fopen("result.txt","r+"); 63 if(fp == NULL) 64 printf("主文件打开错误!\n"); 65 else 66 fp1 = fopen("sort1.txt","r+"); 67 if(fp1 == NULL) 68 printf("第一数据文件打开错误! \n"); 69 else 70 { 71 fp2 = fopen("sort2.txt","r+"); 72 if(fp2 == NULL) 73 printf("第二数据文件打开错误! \n"); 74 else 75 { 76 printf("数据处理中,请稍待。。。\n"); 77 merge(fp,fp1,fp2,LEN); 78 printf("数据处理完成! \n"); 79 fclose(fp); 80 fclose(fp1); 81 fclose(fp2); 82 } 83 } 84 return 0; 85 }
运行后 result.txt 内容: 12345678
直接归并排序
使用磁盘文件 data.txt模拟磁带的操作,文件的内容如下所示:
36518472
程序将上述文件data.txt的数据复制到文件result.txt,然后使用直接归并排序排序文件result.txt。每次将文件分割成split1.txt 和split2.txt。然后归并到result.txt,完成后,文件result.txt就是最后的排序结果
1 #include <stdio.h> 2 #include <stdlib.h> 3 #define LEN 8 4 5 void merge_sort(FILE* merge,FILE* sort1,FILE* sort2,int len) 6 { 7 int s1,s2; 8 int i,j,k; 9 char c,c1,c2; 10 11 for(i = 1;i < len;i *= 2) 12 { 13 for(j = 0;j < len / 2;j++) 14 { 15 c = getc(merge); 16 putc(c,sort1); 17 } 18 for(;j < len;j++) 19 { 20 c = getc(merge); 21 putc(c,sort2); 22 } 23 rewind(merge); 24 rewind(sort1); 25 rewind(sort2); 26 for(k = 0;k < len / 2;k += i) 27 { 28 c1 = getc(sort1); 29 c2 = getc(sort2); 30 s1 = s2 = 0; 31 while(1) 32 { 33 if(c1 < c2) 34 { 35 putc(c1,merge); 36 s1++; 37 if(s1 < i) 38 c1 = getc(sort1); 39 else 40 break; 41 } 42 else 43 { 44 putc(c2,merge); 45 s2++; 46 if(s2 < i) 47 c2 = getc(sort2); 48 else 49 break; 50 } 51 } 52 if(s1 < i) 53 { 54 putc(c1,merge); 55 s1++; 56 } 57 if(s2 < i) 58 { 59 putc(c2,merge); 60 s2++; 61 } 62 while(s1 < i) 63 { 64 c = getc(sort1); 65 putc(c,merge); 66 s1++; 67 } 68 while(s2 < i) 69 { 70 c = getc(sort2); 71 putc(c,merge); 72 s2++; 73 } 74 } 75 rewind(merge); 76 rewind(sort1); 77 rewind(sort2); 78 } 79 } 80 81 82 int main() 83 { 84 FILE* data; 85 FILE* fp; 86 FILE* fp1; 87 FILE* fp2; 88 char c; 89 int j; 90 data = fopen("data.txt","r"); 91 if(data == NULL) 92 { 93 printf("数据文件打开错误! \n"); 94 exit(0); 95 } 96 fp = fopen("result.txt","r+"); 97 if(fp == NULL) 98 printf("主文件打开错误!\n"); 99 else 100 { 101 for(j = 0;j < LEN;j++) 102 { 103 c = getc(data); 104 putc(c,fp); 105 } 106 fclose(data); 107 rewind(fp); 108 fp1 = fopen("split1.txt","r+"); 109 if(fp1 == NULL) 110 printf("第一分割文件打开错误! \n"); 111 else 112 { 113 fp2 = fopen("split2.txt","r+"); 114 if(fp2 == NULL) 115 printf("第二分割文件打开错误! \n"); 116 else 117 { 118 printf("数据处理中,请稍待。。。\n"); 119 merge_sort(fp,fp1,fp2,LEN); 120 printf("数据处理完成! \n"); 121 fclose(fp); 122 fclose(fp1); 123 fclose(fp2); 124 } 125 } 126 } 127 }
运行后 result.txt 内容: 12345678
文件的快速排序
文本文件data.txt的内容是运行文件快速排序的目标文件,文件内容如下:
36518472
程序将文件data.tx 的内容复制到文件 result.txt,然后使用文件的快速排序法排序文件result.txt
1 #include <stdio.h> 2 #include <stdlib.h> 3 #define MAX 8 4 #define LEN sizeof(char) 5 6 char get_char(FILE* fp,int pos) 7 { 8 char c; 9 fseek(fp,LEN* pos,0); 10 fread(&c,LEN,1,fp); 11 return c; 12 } 13 14 void swap_char(FILE* fp,int pos1,int pos2) 15 { 16 char c1,c2; 17 fseek(fp,LEN * pos1,0); 18 fread(&c1,LEN,1,fp); 19 fseek(fp,LEN * pos2,0); 20 fread(&c2,LEN,1,fp); 21 22 fseek(fp,LEN* pos1,0); 23 fwrite(&c2,LEN,1,fp); 24 fseek(fp,LEN * pos2,0); 25 fwrite(&c1,LEN,1,fp); 26 } 27 28 void q_sort(FILE* fp,int left,int right) 29 { 30 char partition; 31 int i,j; 32 33 if(left < right) 34 { 35 i = left; 36 j = right + 1; 37 partition = get_char(fp,left); 38 do{ 39 do{ 40 i++; 41 }while(get_char(fp,i) < partition && i < MAX); 42 do{ 43 j--; 44 }while(get_char(fp,j) > partition); 45 if(i < j) 46 swap_char(fp,i,j); 47 }while(i < j); 48 swap_char(fp,j,left); 49 q_sort(fp,left,j - 1); 50 q_sort(fp,j + 1,right); 51 } 52 } 53 54 void quick(FILE* fp,int n) 55 { 56 q_sort(fp,0,n - 1); 57 } 58 59 int main() 60 { 61 FILE* data; 62 FILE* fp; 63 char c; 64 int j; 65 data = fopen("data.txt","r"); 66 if(data == NULL) 67 { 68 printf("数据文件打开错误! \n"); 69 exit(0); 70 } 71 fp = fopen("result.txt","r+"); 72 if(fp == NULL) 73 printf("主文件打开错误! \n"); 74 else 75 { 76 for(j = 0;j < MAX;j++) 77 { 78 c = getc(data); 79 putc(c,fp); 80 } 81 fclose(data); 82 rewind(fp); 83 printf("数据处理中,请稍待。。。\n"); 84 quick(fp,MAX); 85 printf("数据处理完成!\n"); 86 fclose(fp); 87 } 88 return 0; 89 }
运行后 result.txt 内容: 12345678