问题
对n个不同的数构成的数组A[1,…,n]进行排序,其中n=2^k。
解析
归并排序算法的核心是通过递归的方式将待排序的数组划分为若干子数组,待子数组排序后再不断归并为有序数组。
归并排序算法图解:
设计
核心伪代码:
void MergeSort(int[] a, int l, int r){
int m=(l+r)/2;
if(l<r){
MergeSort(a, l, m);
MergeSort(1, m+1, r);
Merge(a, l, m, r);
}
}
void Merge(int[]a, int l, int m, int r){
int l1=l, l2=m, r1=m+1, r2=r;
int[]temp;
int cnt=0;
while(l1<=l2 && r1<=r2){
if(a[l1]<a[r1]) temp[cnt++]=a[l1++];
else temp[cnt++]=a[r1++];
}
while(l1<=l2) temp[cnt++]=a[l1++];
while(r1<=r2) temp[cnt++]=a[r1++];
for(int i=l;i<=r;++i) a[i]=temp[i-l];
}
分析
时间复杂度:O(nlogn)