外部排序方法代码:归并排序,直接归并排序,文件的快速排序

归并排序

文本文件 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

 

posted @ 2021-01-04 18:13  互联星空  阅读(388)  评论(0编辑  收藏  举报