1.问题
二分归并排序:对n个不同的数构成的数组A[1…n]进行排序,其中n=2^k。
2.解析
3.核心代码
int MergeArray(int a[], int low, int mid, int high, int flag[])
{
int i = low;
int j = mid + 1;
int m = mid;
int n = high;
int k = 0;
while (i <= m && j <= n)
{
if (a[i] <= a[j])
flag[k++] = a[i++];
else
flag[k++] = a[j++];
}
while (i <= m)
flag[k++] = a[i++];
while (j <= n)
flag[k++] = a[j++];
for (i = 0; i < k; i++)
a[low + i] = flag[i];
}
int MergeSort(int a[], int low, int high, int flag[])
{
if (low < high)
{
int mid = (low + high) / 2;
MergeSort(a, low, mid, flag);
MergeSort(a, mid + 1, high, flag);
MergeArray(a, low, mid, high, flag);
}
}
4.时间复杂度
- 最差情况下,比较次数为n-1,时间复杂度为O(nlogn)
- 最优情况下,比较次数为n/2,时间复杂度为O(nlogn)
- 平均复杂度为O(nlogn)