Ultra-QuickSort
Time Limit: 7000MS | Memory Limit: 65536K | |
Total Submissions: 19252 | Accepted: 6828 |
Description
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
1.问题分析
应用归并排序方法。
归并排序nlog(n)的排序速度很不错,而求在排序的过程中,有个归并过程merge(),
这里是将两个有序数列归并为一个有序数列,在归并的过程中,很容易就能够计算逆序对个数,所以可以很快解决这个问题。
即:对于数列[l, mid] [mid + 1, r]的合并,i 从l开始循环,j从mid + 1开始循环,如果遇到a[i] > a[j]
则出现逆序,可以将a[j]放入辅助数组,同时j++,那么和a[j]逆序的数就有mid-i+1个,因为序列是有序的[i,
mid]的所有的数都是大于a[j]的。
2.应用到的算法
比较冒泡排序和归并排序:
T(n)=O(n^2)
T(n)=O(nlog(n))
3.代码:
4.遇到的问题及解决
(1)为什么num要用long long型申请?
假设n=500000个数刚好是从大到小的一个完全逆序,则num=(500000+1)*500000/2这个数的范围超出了long 所能表示的范围
其实也可以申请为_int64
(2)main()中merge_sort函数的参数传递要正确