Ultra-QuickSort 【归并或树状数组+离散化】

来源:互联网 发布:软件测试需求评审 编辑:程序博客网 时间:2024/05/30 05:40

 

Ultra-QuickSort

时间限制(普通/Java):4000MS/40000MS     运行内存限制:65536KByte
总提交: 47            测试通过: 6

描述

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.

 

输入

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.

输出

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.

样例输入

 

59105431230

 

样例输出

 

60

 这个题目归并可以做 我不多说了。。。

还有一种方法就是用binary index tree  就是二进制线索树  大家都叫树状数组,不过不是很标准,不管这些。

题目先要知道转化为求逆序数,逆序数很简单就是4 3 2 1

升序是1 2 3 4  那么就是4前面没有比他大 的数就是0,3前面有个4比他大那么就是1,2前面有3,4都比他大那么逆序数是2,1前面3   全部加起来就是总的逆序数 = 0+1+2+3=6

也就是要交换几次从前面一个个交换下来。

这样可以转化为树状数组去做了,一看数据有999999999那么大数组也开不了,即使开了也太大了 怎么办?

看了下其他作者的方法就是用离散化。反正数据不用管,知道保留数据之间的大小关系就行,何不把大的数据换成小的呢?换了后保留原来数据的相对位置。

然后就可以树状数组了,就是 用向下updata  向上read

两个的代码分别:

全部代码: