Ultra quicksort

# 题意
该排序算法通过交换两个相邻的序列元素处理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 }

 

猜你喜欢

转载自www.cnblogs.com/hhyx/p/12432024.html