1、问题:
对 n n n个不同的数构成的数组 A [ 1.. n ] A[1..n] A[1..n]进行排序,其中 n = 2 k n=2^k n=2k
2、解析:
二分归并排序是经典的分治算法。算法的思路是将长度为n的数组不断划分成 n 2 \frac{n}{2} 2n的子数组,即将 n n n规模的问题转化成为了 n 2 \frac{n}{2} 2n规模的子问题,不断划分,当问题规模为 1 1 1时(长度为 1 1 1的数组本身就是有序的),将每一个长度为 1 1 1的子序列进行归并(归并有序表),不断归并就能够实现将长度为 n 2 \frac{n}{2} 2n的有序表归并得到长度为 n n n的有序表,实现排序。
3、设计(核心伪代码):
void Merge(int a[],int b[], int start, int mid, int end){
int left = start, right=mid+1, tmp = start;
while(left<mid+1 && right<end+1){
if(a[left] > a[right])
b[tmp++] = a[right++];
else
b[tmp++] = a[left++];
}
while(left < mid+1)
b[tmp++] = a[left++];
while(right < end+1)
b[tmp++] = a[right++];
for(left=start; left<=end; left++)
a[left] = b[left];
}
void MergeSort(int a[], int b[], int start, int end){
int mid;
if(start < end){
mid = start + (end-start) / 2;
MergeSort(a, b, start, mid);
MergeSort(a, b, mid+1, end);
Merge(a, b, start, mid, end);
}
}
4、分析:
算法的时间复杂度为O(nlogn)