#include<iostream>
using namespace std;
//将有序表a[first...mid]和a[mid + 1...last]归并成a[first...last]
void merge(int a[], int first, int mid, int last)
{
int length = last - first + 1;
int i = first;
int j = mid + 1;
int k = 0;
int *p = new int[length];
while (i <= mid && j <= last)
{
if (a[i] <= a[j]) //注意,此处不能丢掉等于的情况,否则会破坏掉排序的稳定性
p[k++] = a[i++];
else
p[k++] = a[j++];
}
while (i <= mid) // a[mid + 1...last]已经安顿在p数组中
p[k++] = a[i++];
while (j <= last) // a[first...mid]已经安顿在p数组中
p[k++] = a[j++];
//a[first...mid]和a[mid + 1...last]已经归并到了p数组中
for (k = 0; k < length; k++)
a[k + first] = p[k];
for (int x = first; x < last + 1;x++)
cout << a[x] << " ";
cout << endl;
delete[] p;
p = NULL; //最好加这个
}
void mergeSort(int a[], int first, int last)
{
int mid = (first + last) / 2;
if (first < last)
{
mergeSort(a, first, mid);
mergeSort(a, mid + 1, last);
merge(a, first, mid, last);
}
}
int main()
{
int a[] = { 4, 5, 1, 3, 2, 0, -3 ,-20, 100, 50 };
mergeSort(a, 0, 10 - 1);
int i;
for (i = 0; i < 10; i++)
cout << a[i] << " ";
cout << endl;
return 0;
}
/*归并排序分两步,一部分是拆分递归,第二部分是区域排序,拆分递归思路是,将目标数列拆成两个数列,控制项mid=(初始下标+结束下标)/2,得到两个子数列{a[初始下标],...,a[mid]}和{a[mid+1],...,a[结束下标]},对两个子序列再次进行拆分递归,递归结束条件:初始下标=结束下标,即单个数值。每次拆分递归后进行区域排序,区域排序思想:对拆分递归后的有序数列进行排序结合生成结果数列,将其中的较小值依次放入结果数列,由于操作的数列本身是有序数列,比较后第一个放入的较小值其实是两个数列的最小值,合并之后的结果数列也是有序数列。数列在逐层区域排序之后,其中的数值完全区域有序,最外层的区域排序将得到最终的结果数列*/
代码转自:https://blog.csdn.net/stpeace/article/details/8095099