1. 程式人生 > >北大百練oj題解:2299

北大百練oj題解:2299

考察了利用歸併排序求逆序數(冒泡時間複雜度太長)

#include <iostream>
using namespace std;
long long int num=0;
const int inf=1000000000;//注意可以用來定義inf

void Merge(int s[],int p,int q,int r){
    int n1=q-p+1,n2=r-q;
    int l1[n1+1],l2[n2+1];
    for(int i=0;i<n1;i++)
        l1[i]=s[p+i];
    for(int i=0;i<n2;i++)
        l2[i]=s[q+i+1
]; int k=0,j=0; l1[n1]=inf; l2[n2]=inf; for(int i=p;i<=r;i++) { if(l1[k]<=l2[j]){ s[i]=l1[k]; k++; } else{ s[i]=l2[j]; j++; num=num+n1-k;//統計逆序數 } } } void Sort(int s[],int p,int r) { if
(p<r){ int q=(p+r)/2; Sort(s,p,q); Sort(s,q+1,r); Merge(s,p,q,r); } } int main() { int n; while(cin>>n&&n!=0) { int *s=new int[n]; for(int i=0;i<n;i++) cin>>s[i]; num=0; //一開始寫到了Sort下面,WA了好幾次,傻死了 Sort(s,0
,n-1); cout<<num<<endl; delete []s; } }