数据结构(排序三)

归并排序算法

  利用归并的思想实现的排序方法数组

二路归并排序原理spa

  • 假设初始序列有n个记录,则能够当作n个有序的子序列,每一个子序列的长度为1
  • 而后两两归并,获得n/2个长度为2或1的有序子序列;再次两两归并,...
  • 如此重复,直到获得一个长度为n的有序序列为止

递归实现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

相关文章
相关标签/搜索