归并排序是一个很古老的排序算法,但到了今天依旧具有强大的生命力,因为他是第一个可以在最坏情况下依然保持
O(nlog n) 运行时间的确定性排序算法。
归并排序的主体思想就是分治策略。分治就是将一个大问题分解为很多个小问题,对每一个小问题进行解决,最后根据小问题的解生出大问题的解。具体到了排序中就是以一个数组为例,首先将其由中点分解为两个小数组,再对两个小数组进行分别的分解排序,在对小数组的处理中,将小数组再分解为更小的数组,一直到满足临界条件无法再分解为止。大致的图解如下:
图中可以看出,上半部分是“分”的不断递归的过程,下半部分就是“治”的从小解不断合成直到最终得到整个解。
实现的代码如下:
#include "stdafx.h"
#include "stdlib.h"
#include <iostream>
using namespace std;
void mergeSorted(int a[], int low, int mid, int high, int tmp[])
{
int l = low, m = mid, n = mid + 1, h = high;
int k = 0;
while (l <= m && n <= h)
{
if (a[l] <= a[n])
{
tmp[k++] = a[l++];
}
else
{
tmp[k++] = a[n++];
}
}
while (l <= m)
{
tmp[k++] = a[l++];
}
while (n <= h)
{
tmp[k++] = a[n++];
}
for (int i = 0; i < k; i++)
{
a[low + i] = tmp[i];
}
}
void mergeSort(int a[], int low, int high, int tmp[])
{
if (low < high)
{
int mid = (high + low) /2;
mergeSort(a, low, mid, tmp);
mergeSort(a, mid + 1, high, tmp);
mergeSorted(a, low, mid, high, tmp);
}
return;
}
void main()
{
int a[9] = { 45, 3,68,566,54,88,4,59,74 };
int res[9] = { 0 };
cout << "初始为:";
for (int i = 0; i < 9; i++)
{
cout << a[i] << " ";
}
mergeSort(a, 0, 8, res);
cout << endl;
cout << "归并排序后为:";
for (int i = 0; i < 9; i++)
{
cout << a[i] << " ";
}
cout << endl;
system("PAUSE");
return;
}