数组排序
使用二分归并排序算法,对n个不同的数构成的数组A[1…n]进行排序,其中n=2^k
算法思想
二分归并排序是一种分治算法。这个算法不断地将一个数组分为两部分,分别对左子数组和右子数组排序,然后将两个数组合并为新的有序数组。
算法步骤如下:
(1) 分解:分解待排序的n个元素的数组成各具n/2个元素的两个子数组。
(2) 解决:使用归并排序递归地排序两个子序列。
(3) 合并:合并两个已排序的子序列以产生排序的答案。
当待排序的数组长度为1时,递归“开始回升”,在这种情况下不要做任何工作,因为长度为1的每个数组都已排好序。
下面以绘图方式演示通过二分归并排序算法的过程
核心代码
int Merge(int a[],int low, int mid, int high)// 合并函数
{
int j, k, h;
j = low;
h = mid + 1;
k = low;
while (j<=mid&&h<=high) // 将左右两端数据进行比较,放入辅助数组中
{
if (a[j] < a[h])
b[k++] = a[j++];
else
b[k++] = a[h++];
}
// 将剩余的数据加入到辅助数组中
while (j <= mid)
{
b[k++] = a[j++];
}
while (h<=high)
{
b[k++] = a[h++];
}
for (k = low; k <= high; k++)// 将辅助数组的数据复制到原数组的对应位置上
{
a[k] = b[k];
}
}
int MergeSort(int a[],int low,int high) // 递归分组函数
{
if (low < high)
{
int mid = (low + high) / 2;
MergeSort(a,low, mid);
MergeSort(a,mid + 1, high);
Merge(a,low, mid, high);// 调用Merge函数,合并两组数据
}
}
算法复杂度分析
二分归并排序算法是一种稳定的排序,其时间复杂度是O(logn) 。
Merge算法比较次数:
- 最差情况下,比较次数为n-1,时间复杂度为O(nlogn),例如:2,4,6;1,3,5 比较次数为5
- 最优情况下,比较次数为n/2,时间复杂度为O(nlogn),例如:1,2,3;4,5,6 比较次数为3
- 平均复杂度为O(nlogn)
递归方程如下: