1、规定排序的实现
分治法的三步法:
划分问题:(把序列二分),
递归求解:(分别对左右子序列递归排序)
合并结果:(根据左右两个有序的子序列,依次取两个子序列的最小元素中的最小者加到结果中去)
实现如下:
#include <iostream>
using namespace std;
void mergeSort(int * a, int x, int y, int * t)//归并排序,t为辅助空间
{
if(y-x > 1)//由于是区间[x,y),非空则有y-x>=1,而1个元素的子序列已经有序
{
int m = x + (y-x)/2;//中点
mergeSort(a,x,m,t);
mergeSort(a,m,y,t);
//合并
int p = x, q = m, k = x;
while(1)
{
if(p < m){//左非空
if(q < y){//右非空
if(a[p] < a[q]) t[k++] = a[p++];
else t[k++] = a[q++];
}
else t[k++] = a[p++];
}
else{//左空
if(q < y){//右非空
t[k++] = a[q++];
}//右空
else break;
}
}
for(int i = x; i < y; i ++) a[i] = t[i];
}
}
int main()
{
int n;
int a[100], t[100];
cin >> n;
for(int i = 1; i <= n; i ++) scanf("%d",&a[i]); //输入数据
mergeSort(a,1,n+1,t);
for(int i = 1; i <= n; i ++) printf("%d ",a[i]);
printf("\n");
return 0;
}
归并排序最主要的就是合并的时候的选择最小的元素添加到结果中的适当位置去。
2、归并排序的一个应用——逆序对数
&nb