程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> POJ 2299 Ultra-QuickSort

POJ 2299 Ultra-QuickSort

編輯:C++入門知識

Description
In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a sequence of n distinct integers by swapping two adjacent sequence elements until the sequence is sorted in ascending order. For the input sequence
9 1 0 5 4 ,

Ultra-QuickSort produces the output
0 1 4 5 9 .

Your task is to determine how many swap operations Ultra-QuickSort needs to perform in order to sort a given input sequence.
Input
The input contains several test cases. Every test case begins with a line that contains a single integer n < 500,000 -- the length of the input sequence. Each of the the following n lines contains a single integer 0 ≤ a[i] ≤ 999,999,999, the i-th input sequence element. Input is terminated by a sequence of length n = 0. This sequence must not be processed.
Output
For every input sequence, your program prints a single line containing an integer number op, the minimum number of swap operations necessary to sort the given input sequence.
Sample Input
5
9
1
0
5
4
3
1
2
3
0
Sample Output
6
0
題目大意:優化的冒泡排序,從小到大排序,就是找到一次沒有交換時BREAK,問我們至少交換多少次冒泡排序可完成。
思路:因為每次交換的都是左邊的數大於右邊的數,所以,我們需要求出有多少逆數對即可。可以利用歸並排序求解。
LANGUAGE:C
CODE:
[html] 
#include<iostream> 
#include<cstdlib> 
#include<cstdio> 
using namespace std; 
int a[500005],c[500005]; 
long long cnt; 
void mergesort(int left,int right) 

    int mid,i,j,tmp; 
    if(right>left+1) 
    { 
        mid=(left+right)/2; 
        mergesort(left,mid); 
        mergesort(mid,right); 
        tmp=left; 
        for(i=left,j=mid;i<mid&&j<right;) 
        { 
            if(a[i]>a[j]) 
            { 
                c[tmp++]=a[j++]; 
                cnt+=mid-i; 
            } 
            else c[tmp++]=a[i++]; 
        } 
        if(j<right)for(;j<right;++j)c[tmp++]=a[j]; 
        else for(;i<mid;++i)c[tmp++]=a[i]; 
        for(i=left;i<right;++i) a[i]=c[i]; 
    } 

int main() 

    //freopen("in.txt","r",stdin); 
    int n; 
    while(cin>>n,n) 
    { 
        cnt=0; 
        for(int i=1;i<=n;i++) 
        cin>>a[i]; 
        mergesort(1,n+1); 
        cout<<cnt<<endl; 
    } 
    return 0; 


作者:ultimater

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved