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

 

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.

样例输入

 

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

两个的代码分别:

全部代码:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

helihui123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值