數據結構(排序三)

歸併排序算法

  利用歸併的思想實現的排序方法數組

二路歸併排序原理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

相關文章
相關標籤/搜索