经典排序算法+文件操作~c语言实现

  1  #include <malloc.h>
  2  #include <stdio.h>
  3  #include <time.h>
  4  #include <stdlib.h>
  5  #define MAXSIZE 10
  6 typedef struct {
  7      int L[MAXSIZE+1];
  8      int length;
  9  
 10  }List,*list;
 11  void swap(List &L,int low,int high){
 12      int temp;
 13      temp=L.L[low];
 14      L.L[low] = L.L[high];
 15      L.L[high]=temp;
 16  }
 17  /**************************************
 18   *                 快速排序           *
 19   * ************************************/
 20  
 21  int Partition(List &L,int low,int high){
 22      int pro;
 23      pro=L.L[low];
 24      while(low<high){
 25  
 26          while(L.L[high]>=pro&&low<high){
 27                  high--;
 28          }
 29          swap(L,low,high);
 30          while(L.L[low]<=pro&&low<high){
 31              low++;
 32          }
 33  
 34  
 35          swap(L,low,high);
 36  
 37      }
 38      //L.L[low]=L.L[0];
 39      return low;
 40  
 41  }
 42  void Qsort(List &list,int low,int high){
 43      int pivot;
 44      if(low<high){
 45          pivot = Partition(list,low,high);
 46          Qsort(list,low,pivot-1);
 47          Qsort(list,pivot+1,high);
 48      }
 49  
 50  }
 51  
 52  
 53  /****************************
 54   *             冒泡排序            *
 55   * **************************/
 56   void bubbleSort(List &list){
 57       int i,j;
 58       bool flag=1;
 59       for(i=1;i<=list.length&&flag;i++){
 60           flag=0;
 61           for(j=list.length-1;j>=i;j--){
 62               if(list.L[j]>list.L[j+1]){
 63                   swap(list,j,j+1);
 64                   flag=1;
 65               }
 66           }
 67       }
 68  
 69   }
 70  /***************************
 71   *        简单选择排序      *
 72   ***************************/
 73   void selectSort(List &list){
 74       int i,j,min;
 75       for(i=0;i<=list.length;++i){
 76           min=i;
 77           for(j=i+1;j<=list.length;++j){
 78               if(list.L[min]>list.L[j]){
 79                   //swap(list,min,j);
 80                   min=j;
 81               }
 82           }
 83          if(i!=min){
 84               swap(list,min,i);
 85           }
 86       }
 87  
 88   }
 89   /*************************
 90    *     直接插入排序          *
 91    *************************/
 92   void insertSort(List &list){
 93       int i,j;
 94       for(i=2;i<=list.length;++i){
 95           if(list.L[i]<list.L[i-1]){
 96               list.L[0]=list.L[i];
 97               for(j=i-1;list.L[j]>list.L[0];--j){
 98                   list.L[j+1]=list.L[j];
 99               }
100              list.L[j+1]=list.L[0];
101           }
102       }
103   }
104  /***********************
105   *         希尔排序    *
106   ***********************/
107   void sheelSort(List &list){
108       int i,j;
109       int increment=list.length;
110  
111       do{
112           increment = increment/3+1;
113           for(i=increment+1;i<=list.length;++i){
114               if(list.L[i]<list.L[i-increment]){
115                  list.L[0]=list.L[i];
116                   for(j=i-increment;list.L[0]<list.L[j]&&j>0;j-=increment){
117                       list.L[j+increment]=list.L[j];
118                   }
119                   list.L[j+increment] = list.L[0];
120               }
121           }
122       }while(increment!=1);
123  
124   }
125    /***********************
126  2   *      归并排序       *
127  3   ***********************/
128  
129  void merge(int SR[],int TR[],int i,int m,int n){
130        int j,k,l;
131        for(j=m+1,k=i;i<=m&&j<=n;k++){
132            if(SR[i]<SR[j]){
133                TR[k]=SR[i++];
134            }else{
135                TR[k]=SR[j++];
136            }
137        }
138          if(i<=m){
139                for(l=0;l<=m-i;l++){
140                   TR[k+l]=SR[i+l];
141                }
142            }
143            if(j<=n){
144                for(l=0;l<=n-j;l++){
145                    TR[k+l]=SR[j+l];
146                }
147            }
148  
149  
150    }
151  
152   void mergePass(int SR[],int TR[],int s,int n){
153       int i=1;
154       int j;
155       while(i<=n-(2*s)+1){
156           merge(SR,TR,i,i+s-1,i+(2*s)-1);
157           i=i+(2*s);
158  
159       }
160       if(i<n-s+1){
161           merge(SR,TR,i,i+s-1,n);
162       }else{
163           for(j=i;j<=n;j++){
164               TR[j]=SR[j];
165           }
166       }
167  
168  
169   }
170  void mergeSort2(List* list){
171       int *TR = (int*)malloc((list->length+1)*sizeof(int));
172       int k=1;
173      while(k<list->length){
174           mergePass(list->L,TR,k,list->length);
175           k=2*k;
176           mergePass(TR,list->L,k,list->length);
177           k=2*k;
178       }
179  
180   }
181   void mSort(int SR[],int TR1[],int s,int t){
182       int m;
183       int TR2[MAXSIZE+1];
184       if(s==t){
185           TR1[s]=SR[s];
186       }else{
187           m=(s+t)/2;
188           mSort(SR,TR2,s,m);
189           mSort(SR,TR2,m+1,t);
190           merge(TR2,TR1,s,m,t);
191       }
192   }
193   void mergeSort(List* list){
194      mSort(list->L,list->L,1,list->length);
195   }
196  
197 /****************** 
198  *      文件操作    * 
199  ******************/
200 int createSourceFile(){
201     FILE *fp;
202       if((fp = fopen("source.txt","w+"))==NULL){
203           printf("can not open");
204            return 1;
205            //exit(0);
206       }
207        srand(time(NULL));
208        int tag;
209    for(tag=1;tag<=MAXSIZE;tag++){
210          
211      //    list.L[tag] = rand()%2000;
212          fprintf(fp,"%d ",rand()%2000);
213      }
214      fclose(fp);
215      return 0;
216 }  
217 void readSourceFile(List & list){
218     FILE *fp;
219       if((fp = fopen("source.txt","r"))==NULL){
220           printf("can not open");
221            exit(0);
222       }
223       int tag;
224    for(tag=1;tag<=MAXSIZE;tag++){
225          
226      //    list.L[tag] = rand()%2000;
227          fscanf(fp,"%d ",&list.L[tag]);
228          //printf("%d ",list.L[tag]);
229      }
230      fclose(fp);
231 }
232 void createToFile(List &list){
233     FILE *fp;
234       if((fp = fopen("to.txt","w+"))==NULL){
235           printf("can not open");
236            exit(0);
237       }
238        srand(time(NULL));
239        int tag;
240    for(tag=1;tag<=MAXSIZE;tag++){
241          
242      //    list.L[tag] = rand()%2000;
243          fprintf(fp,"%d ",list.L[tag]);
244          if(tag%5==0){
245          fprintf(fp,"\n");
246          }
247      }
248      fclose(fp);
249 }
250 /********************
251  *        查看list    *
252  ********************/
253 void show(List &list){
254     int i;
255     for(i=1;i<MAXSIZE+1;i++){
256     printf("%d,",list.L[i]);
257     }
258     printf("\n");
259 }
260 
261 /******************
262  *        菜单     * 
263  *****************/
264  
265 void mune(){
266     printf("         ********************\n\
267      *     排序大集合   *\n\
268      ********************\n\
269     ----------------------\n\
270     |  1.生成随机数文件\n\
271     |  2.快速排序\n\
272     |  3.冒泡排序\n\
273     |  4.简单选择排序\n\
274     |  5.直接插入排序\n\
275     |  6.希尔排序\n\
276     |  7.归并排序(递归)\n\
277     |  8.归并排序(非递归)\n\
278     |  9.保存至文件\n\
279     |  #.查看数据\n\
280     |  0.退出\n\
281     ----------------------\n\
282     请输入您的指令\n");
283 
284      //return 
285  }
286 
287  int main(){
288 
289      List list={{0},MAXSIZE};
290      //Qsort(list,0,9);    //快速排序
291      //bubbleSort(list);
292      //selectSort(list);
293      //insertSort(list);
294     
295      //createSourceFile();
296      //readSourceFile(list);
297      mune();
298      char num='1';
299     for(num;num!='0';){
300         
301          scanf("%c",&num); 
302          getchar();
303           switch(num){
304         case '1':
305         if(createSourceFile()){
306             printf("file error\n");
307         }else{
308             printf("file create success~~\n");
309             readSourceFile(list);
310         }
311             break;
312         case '2':
313             readSourceFile(list);
314             Qsort(list,0,MAXSIZE);
315             printf("操作成功~~\n"); 
316             break;
317         case '3':
318             readSourceFile(list);
319             bubbleSort(list);
320             printf("操作成功~~\n");
321             break;
322         case '4':
323             readSourceFile(list);
324             selectSort(list);
325             printf("操作成功~~\n");
326             break;
327         case '5':
328             readSourceFile(list);
329             insertSort(list);
330             printf("操作成功~~\n");
331             break;
332         case '6':
333             readSourceFile(list);
334             sheelSort(list);
335             printf("操作成功~~\n");
336             break;
337         case '7':
338             readSourceFile(list);
339             mergeSort(&list);
340             printf("操作成功~~\n");
341             break;
342         case '8':
343             readSourceFile(list);
344             mergeSort2(&list);
345             printf("操作成功~~\n");
346             break;
347         case '9':
348             createToFile(list);
349             printf("操作成功~~\n");
350             break;
351         case '#':
352             
353             show(list);
354             break;
355         default :
356             printf("输入有误,请重输\n");
357     }
358         
359     }
360 
361      return 0;
362  }
363  
友情链接:http://happyrxk.cn
原文地址:https://www.cnblogs.com/happyDays/p/2812220.html