简介
“归并”的含义是将两个或两个以上的有序表组合成一个新的有序表,归并排序和快排一样也采用的是分治的思想,它的基本原理是通过对若干个有序结点序列的合并为一个有序序列来实现排序的。
它的效率是比较高的的排序方法,他通常应用于数据量比较大的场合。
下面这篇博客讲解了如何使用使用归并求一个整数序列中逆序对数(http://blog.youkuaiyun.com/mitedu/article/details/3882343)
算法描述
假设初始序列含有n个数,则可以看成是n个有序的子序列(一个元素的序列看为有序),每个子序列的长度为1,然后两两归并,得到 (n+1)/2个长度为2或1的有序子序列;再两两归并,….,如此重复,直至得到一个长度为n的有序序列位置。
时间复杂度:O(Nlog2N)(二为底)。
代码实现
void Marge(int* a, int start, int mid, int end, int* tmp)
{//合并
int i = start;
int j = mid;
int k = mid + 1;
int l = end;
int index = start;
while (i <= j && k <= l)
{//选择两边较小的那个放入tmp
if (a[i] < a[k])
tmp[index++] = a[i++];
else
tmp[index++] = a[k++];
}
//此时一边已经为空,将另一边直接放入tmp
while (i <= j)
{
tmp[index++] = a[i++];
}
while (k <= l)
{
tmp[index++] = a[k++];
}
//把tmp放入a
for (int len = start; len <= end; ++len)
a[len] = tmp[len];
}
void _MargeSort(int* a, int start, int end, int* tmp)
{//分解为n个由一个元素的组成的有序数组
if (start >= end)
return;
int mid = (start + end)/2;
//分治思想处理两边
_MargeSort(a, start, mid, tmp);
_MargeSort(a, mid + 1, end, tmp);
Marge(a, start, mid, end, tmp);
}
void MargeSort(int* a, int len)
{
int* tmp = new int[len];
_MargeSort(a, 0, len - 1, tmp);
delete[] tmp;
}
int main()
{
int a[] = {1,8,3,6,5,2,4};
MargeSort(a, sizeof(a) / sizeof(a[0]));
for (int i = 0; i < (sizeof(a) / sizeof(a[0]));i++)
cout << a[i] << ' ';
return 0;
}