归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
简单来说,归并排序是比较简单,又比较稳定的算法。
只要是会调用递归的朋友,一定就可以手打出归并排序。
归并操作(merge),也叫归并算法,指的是将两个顺序序列合并成一个顺序序列的方法。
如 设有数列{6,202,100,301,38,8,1}
初始状态:6,202,100,301,38,8,1
第一次归并后:{6,202},{100,301},{8,38},{1},比较次数:3;
第二次归并后:{6,100,202,301},{1,8,38},比较次数:4;
第三次归并后:{1,6,8,38,100,202,301},比较次数:4;
总的比较次数为:3+4+4=11,;
逆序数为14;
速度仅次于 快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的 数列
int n, a[maxn], t[maxn];
LL ans;//返回记录的逆序数
void Merg_Sort(int x, int y)
{
if (y - x <= 1)
return;
int mid = x + (y - x) / 2;
Merg_Sort(x, mid);
Merg_Sort(mid, y);
int p = x;
int q = mid;
int i = x;
while (p < mid || q < y)
{
if (q >= y || (p < mid&&a[p] <= a[q]))
{
t[i++] = a[p++];
}
else
{
if (p < mid)
ans += (mid - p);
t[i++] = a[q++];
}
}
for (i = x; i < y; i++)
{
a[i] = t[i];
}
}