# 题意
该排序算法通过交换两个相邻的序列元素处理n个不同整数的序列,直到序列升序排列,确定超快速排序需要交换多少次
# 题解
只通过交换相邻数值的方法排序实际上就是冒泡排序,在排序过程中每找到一组逆序的相邻值进行交换,这样会使得整个序列中的逆序对个数-1,所以最终排好序以后,逆序对个数显然为0,所以对a进行冒泡排序需要的最少交换次数就是序列a中逆序对的个数
1 #include<bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 const int N=1e6+10; 5 int n; 6 int a[N]; 7 int ans[N]; 8 ll merge_sort(int l,int r){ 9 if(l>=r) return 0; 10 int mid=l+r>>1; 11 ll res=merge_sort(l,mid)+merge_sort(mid+1,r); 12 13 int k = 0,i = l,j = mid+1; 14 while(i <= mid && j <= r){ 15 if(a[i] <= a[j]) 16 ans[k++]=a[i++]; 17 else{ 18 ans[k++]=a[j++]; 19 res+=mid-i+1; 20 } 21 } 22 while(i <= mid) ans[k++] = a[i++]; 23 while(j <= r) ans[k++] = a[j++]; 24 25 for(int i = l,j = 0; i <= r; i++,j++) 26 a[i]=ans[j]; 27 return res; 28 } 29 int main(){ 30 ios::sync_with_stdio(0); 31 cin.tie(0); 32 cout.tie(0); 33 while(cin>>n&&n){ 34 for(int i=0;i<n;i++) 35 cin>>a[i]; 36 37 cout<<merge_sort(0,n-1)<<endl; 38 } 39 }