1、算法思想:
归并排序是简历在归并操作上的一种有效的排序算法,该算法的递归实现方式是采用分治法的一个典型的应用,它是一个稳定的排序算法,其时间复杂度为O(N*logN),空间复杂度为O(N).
在介绍其具体实现之前,我们先来回忆下如何将两个有序序列合并的问题(http://blog.csdn.net/qiyingrunhua/article/details/13276833).该算法可简写成以下形式:
//将有序数组a[]和b[]合并到c[]中
void MemeryArray(int a[], int n, int b[], int m, int c[])
{
int i, j, k;
i = j = k = 0;
while (i < n && j < m)
{
if (a[i] < b[j])
c[k++] = a[i++];
else
c[k++] = b[j++];
}
while (i < n)
c[k++] = a[i++];
while (j < m)
c[k++] = b[j++];
}
二路归并排序的思想是假定排序表有n个元素,则可以看作n个有序表,每个子表的长度为1,然后两两归并,得到n/2个长度为2的有序表,再进行两两归并……如此重复,直到合并成一个长度为n的有序表为止.
2、算法实现
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++]; //temp[]暂存排序后的数组,寻找较小的数写入并后移
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++) //上面的功能是合并2个有序序列
a[first + i] = temp[i]; //将temp写回写回原序列
}
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); //再将二个有序数列合并
}
}
bool MergeSort(int a[], int n)
{
int *p = new int[n];
if (p == NULL)
return false;
mergesort(a, 0, n - 1, p);
delete[] p;
return true;
}
(以上算法参考
MoreWindows之博客)