归并排序算法
利用归并的思想实现的排序方法数组
二路归并排序原理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