Ultra-QuickSort
总提交: 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.
样例输入
5
9
1
0
5
4
3
1
2
3
0
样例输出
6
0
这个题目归并可以做 我不多说了。。。
还有一种方法就是用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
两个的代码分别:
全部代码: