插入排序,链接戳这里:http://blog.csdn.net/chaseraod/article/details/75091908
选择排序,链接戳这里:http://blog.csdn.net/chaseraod/article/details/75092407
交换排序,链接戳这里:http://blog.csdn.net/chaseraod/article/details/75094970
本文是常见排序算法的最后一讲,归并排序。
基本思想:设两个有序的子序列(相当于输入序列)放在同一序列中相邻的位置上:array[low..m],array[m + 1..high],先将它们合并到一个局部的暂存序列 tmp (相当于输出序列)中,待合并完成后将 tmp 复制回 array[low..high]中,从而完成排序。
如图:
代码:
void Merge(int* a, int* tmp, int begin1, int end1, int begin2, int end2)
{
size_t pos = begin1;
size_t index = begin1;
while (begin1 <= end1 && begin2 <= end2)
{
if (a[begin1] < a[begin2])
tmp[index++] = a[begin1++];
else
tmp[index++] = a[begin2++];
}
while (begin1 <= end1)
{
tmp[index++] = a[begin1++];
}
while (begin2 <= end2)
{
tmp[index++] = a[begin2++];
}
memcpy(a + pos, tmp + pos, sizeof(int)*(end2 - pos + 1));
}
void _MergeSort(int* a, int* tmp, int left, int right)
{
if (left >= right)
return;
int mid = left + (right - left) / 2;
// 0 0 1 1
// [left mid] [mid+1, right]
_MergeSort(a, tmp, left, mid);
_MergeSort(a, tmp, mid + 1, right);
Merge(a, tmp, left, mid, mid + 1, right);
}
void MergeSort(int* a, size_t n)
{
assert(a);
int* tmp = new int[n];
_MergeSort(a, tmp, 0, n - 1);
delete[] tmp;
}
测试:
int main()
{
int a[] = { 1, 5, 3, 2, 8, 0, 7, 9, 4, 6 };
int sz = sizeof(a) / sizeof(a[0]);
MergeSort(a,sz);
for (int i = 0; i < sz; i++)
{
cout << a[i] << " ";
}
cout << endl;
system("pause\n");
return 0;
}
运行结果: