Ultra-QuickSort【归并排序典型题目】

Ultra-QuickSort
Time Limit: 7000MS   Memory Limit: 65536K
Total Submissions: 34470   Accepted: 12382

题目链接:http://poj.org/problem?id=2299

Description

Ultra-QuickSort【归并排序典型题目】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

Source

 
题目大意:给出一段数字序列,每次只能交换相邻的两个数,问最少需要多少次可以使得这段序列变成顺序序列。
思路:用冒泡排序超时,因为给的数据量很大。用归并排序的方法可以求出逆序数,在这里,逆序数就是冒泡排序的交换次数,所以这道题目就是用归并排序的方法对数组进行排序,并得出逆序数,输出即可。
代码:
 1 #include<iostream>

 2 #include<string.h>

 3 #include<cstdio>

 4 #include<cstdlib>

 5 #define max 1000000

 6 using namespace std;

 7 int n,f[max],g[max];

 8 long long int sum=0;

 9 void guibing(int l,int mid,int r)

10 {

11     int t=0;

12     int i=l,j=mid+1;

13     while(i<=mid&&j<=r)

14     {

15         if(f[i]<=f[j])

16         {

17             g[t++]=f[i];

18             i++;

19         }

20         else

21         {

22                 g[t++]=f[j];

23                 j++;

24                 sum=sum+mid-i+1;

25         }

26     }

27     while(i<=mid)g[t++]=f[i++];

28     while(j<=r)g[t++]=f[j++];

29     for(i=0;i<t;i++)

30     f[l+i]=g[i];

31 }

32 void quicksort(int l,int r)

33 {

34     if(l<r)

35     {

36         int mid=(l+r)/2;

37         quicksort(l,mid);

38         quicksort(mid+1,r);

39         guibing(l,mid,r);

40     }

41 }

42 int main()

43 {

44     while(1)

45     {

46         cin>>n;

47         if(n==0)break;

48         int i;

49         sum=0;

50         for(i=0;i<=n-1;i++)

51         cin>>f[i];

52         quicksort(0,n-1);

53         cout<<sum<<endl;

54     }

55     return 0;

56 }
View Code

你可能感兴趣的:(Quicksort)