时间复杂度:O(nlogn)
适用于:求逆序数(需要注意的是,归并排序不仅仅是在排序的时候进行加一计算,而是通过归并排序的特点,判断在该点之前或者之后会有多少个大于或者小于改点)
思路:
将数组不断划分为更小的区间进行比较
代码:
#include<iostream>
#include<cstdio>
using namespace std;
int a[110000], c[110000]; //需要一个临时数组进行存储
void Merge(int a[],int first,int last)
{
int mid = (first+last)/2;
int temp = first; //C数组的下标
int p = first, q = mid+1; //前一部分和后一部分的数据比较
//大小比较
while( p <= mid && q <= last)
{
if(a[p] > a[q])
c[temp++]=a[q++];
else
c[temp++]=a[p++];
}
//数组剩余
while(q<=last)
c[temp++]=a[q++];
while(p<=mid)
c[temp++]=a[p++];
//复制
for(int i = first; i<=last; i++)
{
a[i]=c[i];
cout << c[i] << " ";
}
cout << endl;
}
void MergeSort(int a[],int first,int last)
{
if(first == last)
return;
int mid=(first+last)/2;
MergeSort(a,first,mid);
MergeSort(a,mid+1,last);
Merge(a,first,last);
}
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=0; i<n; i++)
cin >> a[i];
MergeSort(a,0,n-1);
for(int i=0; i<n; i++)
cout << a[i] << " ";
cout << endl;
}
return 0;
}