歸併排序算法
利用歸併的思想實現的排序方法數組
二路歸併排序原理spa
遞歸實現code
1 #include <stdio.h> 2 #define MAXSIZE 15 3 4 void sort(int *s1,int n,int *s2,int m){ 5 int i,j,k=0; 6 int temp[MAXSIZE]; 7 for(i=0,j=0;i<n && j<m;){ 8 if(s1[i]<s2[j]) 9 temp[k++]=s1[i++]; 10 else 11 temp[k++]=s2[j++]; 12 } 13 while(i<n) 14 temp[k++]=s1[i++]; 15 while(j<m) 16 temp[k++]=s2[j++]; 17 for(i=0;i<k;i++){ 18 s1[i]=temp[i]; 19 } 20 } 21 22 void MergeSort(int a[],int n){ 23 int *s1,*s2,m; 24 if(n>1){ 25 s1=a; 26 m=n/2; 27 s2=s1+m; 28 MergeSort(s1,m); 29 MergeSort(s2,n-m); 30 sort(s1,m,s2,n-m); 31 } 32 } 33 34 void main(){ 35 int a[]={9,8,7,6,5,4,3,2,1,0},i; 36 MergeSort(a,10); 37 for(i=0;i<10;i++){ 38 printf("%d ",a[i]); 39 } 40 }
迭代實現blog
1 void MergeSort(int a[],int n){ 2 int i,left_min,left_max,right_min,right_max; 3 int next=0,k; 4 int *temp=(int *)malloc(sizeof(int)*n); 5 6 for(i=1;i<n;i*=2){ 7 for(left_min=0;left_min<n-1;left_min=right_max){ 8 left_max=right_min=left_min+i; 9 right_max=right_min+i; 10 11 //若長度爲基數,right_min+i會超出長度n 12 if(right_max>n) 13 right_max=n; 14 15 while(left_min<left_max && right_min<right_max) 16 a[left_min]>a[right_min]?(temp[next++]=a[right_min++]):(temp[next++]=a[left_min++]); 17 18 //這裏並沒像遞歸同樣,將兩組數據都放入temp中再存入原數組 19 //而是把沒有沒有存入temp中的一邊的數據(這些數據已經在上一次循環中正序),統一放入右邊組相應倒數位置 20 while(left_min<left_max) 21 a[--right_min]=a[--left_max]; 22 23 //這裏正好銜接了上一步未插入temp中的數據,將存入temp的已排序數據覆蓋原數組對應位置數據(第一組開始位置到當前right_min) 24 while(next>0) 25 a[--right_min]=temp[--next]; 26 } 27 } 28 }
總結排序
7種排序算法其實都屬於內排序算法,按原理又能夠分爲4類遞歸
效率又各有區別:io
對於數據規模和原序數分佈的差異要用不一樣的排序方法;class