当前位置:编程学习 > C/C++ >>

(应用排序算法编程7.2.2)POJ 2299 Ultra-QuickSort(使用归并排序来计算逆序对的个数)

 
/* 
 * POJ_2299.cpp 
 * 
 *  Created on: 2013年11月1日 
 *      Author: Administrator 
 */  
  
#include <iostream>  
#include <cstdio>  
  
using namespace std;  
  
const int maxn = 500010;  
  
typedef long long lolo;//这里不要使用int,因为a[i]的范围达到了999999999。在最坏的情况下,需要交换的次数已经不是int类型的数所能表示的了  
lolo a[maxn],t[maxn];  
lolo ans;  
  
//归并排序..归并排序是分治思想的一个典型的应用  
void my_sort(lolo l , lolo r){  
    if(l == r){  
        return ;  
    }  
  
    lolo mid = (l+r)/2;  
    my_sort(l,mid);  
    my_sort(mid+1,r);  
  
    lolo i = l,j = mid+1,now = 0;  
    while(i <= mid && j <= r){  
        if(a[i] > a[j]){  
            ans += (mid - i + 1);//当a[i]>a[j]时,a[i]后面的数都能与a[j]形成逆序对  
            t[++now] = a[j++];  
        }else{  
            t[++now] = a[i++];  
        }  
    }  
  
    while(i <= mid){  
        t[++now] = a[i++];  
    }  
  
    while(j <= r){  
        t[++now] = a[j++];  
    }  
  
    now = 0;  
    for(i = l ; i <= r ; ++i){//将临时数组t[]中的数组复制到a[]数组中  
        a[i] = t[++now];  
    }  
}  
  
int main(){  
    lolo n;  
  
    while(scanf("%lld",&n)!=EOF,n){  
        ans = 0;  
  
        lolo i;  
        for(i = 1 ; i <= n ;++i){  
            scanf("%lld",&a[i]);  
        }  
  
        my_sort(1,n);  
        printf("%lld\n",ans);  
    }  
  
    return 0;  
}  

 
 
本题如果使用搜索的思想来做,那么时间复杂度将达到o(n^2),因为给的数很大,这是很可能会TLE,所以我们需要摆脱搜索的思想,采用分治的方法来做...............
补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,