二路归并排序
1.稳定排序
2.时间复杂度,最好最坏和平均 o(nlog2n)
3.空间复杂度o(n)
4.与序列初始状态无关
提示:以下是本篇文章正文内容,下面案例可供参考
一、概述
归并排序是将两个或两个以上的有序表组成一个新的有序表
二、代码
1.一次归并
代码如下(示例):
int *b = (int *)malloc(sizeof(int) * Maxsize); //建立辅助数组
void Merge(int a[], int low, int mid, int high)
{
int i, j, k;
for (i = low; i <= high; i++)
{
b[i] = a[i]; //将数组a复制到数组b
}
for (i = low, j = mid + 1, k = i; i <= mid && j <= high; k++) //a[low]到a[high]从小到大排序
{
if (b[i] <= b[j])
a[k] = b[i++];
else
a[k] = b[j++];
}
while (i <= mid) //两个while只会运行其中一个
a[k++] = b[i++];
while (j <= high)
a[k++] = b[j++];
}
2.MergeSort(递归)
代码如下(示例):
void 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);
}
}
总结
归并排序还是很好理解的。值得注意的是归并排序的比较次数,例如两个各有n个元素的有序表合并为一个有序表,最少比较n次(一个表中最小的元素比另一个表中最大的元素还要大),最多比较2n-1(两个表间隔比较);