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;
}
運行結果演示: