题目描述
在这个问题中,您必须分析特定的排序算法----超快速排序。
该算法通过交换两个相邻的序列元素来处理n个不同整数的序列,直到序列按升序排序。
对于输入序列 9 1 0 5 4
,超快速排序生成输出 0 1 4 5 9
。
您的任务是确定超快速排序需要执行多少交换操作才能对给定的输入序列进行排序。
输入样例
5
9
1
0
5
4
3
1
2
3
0
输出样例
6
0
算法1 冒泡排序
(暴力枚举) $O(n^2)$
两重循环记录交换次数
C++ 代码
无
算法2 归并排序
(分治?) $O(nlogn)$
每一次比较后的插入都是最佳的位置
所以所有的交换次数不多也不少
每一次的实际交换次数为mid-i+1
C++ 代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e6+10;
int n,q[N],tmp[N];
LL ms(int l,int r)
{
if(l>=r) return 0;
LL res;
int mid=l+r>>1;
res=ms(l,mid)+ms(mid+1,r);
int k=0,i=l,j=mid+1;
while(i<=mid&&j<=r)
{
if(q[i]<=q[j]) tmp[k++]=q[i++];
else
{
tmp[k++]=q[j++];
res+=mid-i+1;
}
}
while(i<=mid) tmp[k++]=q[i++];
while(j<=r) tmp[k++]=q[j++];
for(int i=l,j=0;i<=r;i++,j++) q[i]=tmp[j];
return res;
}
int main()
{
cin>>n;
while(n)
{
for(int i=0;i<n;i++) cin>>q[i];
printf("%lld\n",ms(0,n-1));
cin>>n;
}
return 0;
}