歸併排序算法

1、算法思想

分治法 自頂而下實現歸併排序:

     設歸併排序的當前區間是R[low..high],分治法的三個步驟是:

①分解:將當前區間一分爲二,即求分裂點
                 
 

②求解:遞歸地對兩個子區間R[low..mid]和R[mid+1..high]進行歸併排序;
③組合:將已排序的兩個子區間R[low..mid]和R[mid+1..high]歸併爲一個有序的區間R[low..high]。
  遞歸的終結條件:low==high


2、算法分析

(1)穩定性

 歸併排序是一種穩定的排序。

(2)存儲結構

可用順序存儲結構。也易於在鏈表上實現。

(3)時間複雜度

對長度爲n的文件,需進行 趟二路歸併,每趟歸併的時間爲O(n),故其時間複雜度無論是在最好情況下還是在最壞情況下均是O(nlgn)。

(4)空間複雜度

需要一個輔助向量來暫存兩有序子文件歸併的結果,故其輔助空間複雜度爲O(n),顯然它不是就地排序。

  注意:
     若用單鏈表做存儲結構,很容易給出就地的歸併排序

我的C版本code:

 

 

#include <stdio.h>
#include <stdlib.h>

int num;

void Merge(int r[],int d[], int low,int mid,int high)
{
 int i = low;
 int j = mid + 1;
 int k = low;
 
 while(i <= mid && j <= high)
 {
  if(r[i] <= r[j]) d[k++] = r[i++];
  else d[k++] = r[j++];
 }
 while(i <= mid)
 {
  d[k++] = r[i++];
 }
 while(j <= high)
 {
  d[k++] = r[j++];
 } 

 for(int m=0;m<num;m++)
 {
  r[m] = d[m];
 }
}

void MergeSort(int r[],int d[],int low,int high)
{
 if(low == high) d[low] = r[low];
 else
 {
  int mid = (low + high)/2;
  MergeSort(r,d,low,mid);
  MergeSort(r,d,mid+1,high);
  Merge(d,r,low,mid,high);
 } 
}

int main()
{

 printf("Input the waiting to MergeSort sequence's MAX_SIZE:\n");
 scanf("%d",&num);

 int r[num],i=0;
 int *d = (int*)malloc(num*sizeof(int));

 printf("Input the %d Integer_elements of the sequence:\n",num);
 for(i=0;i<num;i++){ 
  scanf("%d",&r[i]);
 }
 MergeSort(r,d,0,num-1);
 printf("After sorted:\n");
 for(i=0;i<num;i++)
 {
  printf(" %d",d[i]);  
 }
 printf("\n");
 free(d);

 return 0; 
}

 運行結果演示:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章