问题描述
对n个不同的数构成的数组A[1…n]进行排序,其中n=2^k
解析
二分归并排序分为两个部分,先分,把需要排序的数据分成若干子序列,最后拆到每个子序列只有一个数,后治,归并的时候按照大小排序。
总的来说就是将问题分解成若干个小问题。
对28,72,59,97,12,38,29,65从小到大排序如图所示
设计
(1)
void mergearray(int a[], int first, int mid, int last, int temp[])
{
int i = first, j = mid + 1;
int m = mid, n = last;
int k = 0;
while (i <= m && j <= n)
{
if (a[i] <= a[j])
temp[k++] = a[i++];
else
temp[k++] = a[j++];
}
while (i <= m)
temp[k++] = a[i++];
while (j <= n)
temp[k++] = a[j++];
for (i = 0; i < k; i++)
a[first + i] = temp[i];//对first-last排序
}
(2)
void mergesort(int a[], int first, int last, int temp[])
{
if (first < last)
{
int mid = (first + last) / 2;
mergesort(a, first, mid, temp); //使左边有序
mergesort(a, mid + 1, last, temp); //使右边有序
mergearray(a, first, mid, last, temp); //再将二个有序数列合并
}
}
分析