求一个很大的数组(乱序)排序后从第i大到第j大之间的所有元素,并且这些元素之间要求有序

        有时候我们会碰到这样一种情况,有一个很大的乱序数组raw_array[0 -> n -1](百万量级甚至更大),要求这个数组排序后从第i大到第j(j >= i)大个元素,这些元素之间要有序,其中j - i 远小于数组长度n。

        这个问题很明显的做法就是对原数组raw_array进行排序,排序后的数组为sorted_array[0 -> n - 1], 需要的结果就是sorted_array[i -> j]。但是这样做的复杂度比较高,O(n*n)量级的。之所以复杂度比较高,是因为做了一些无用的工作,我们的目标只是要求得排序后的sorted_array[i -> j]这些元素, 至于sorted_array[0 -> i - 1], sorted_array[j + 1 -> n - 1]是不是有序不重要,只要保证对于sorted_array[0 -> i - 1]中的所有元素都小于sorted_array[i -> j]中的任何一个,sorted_array[j + 1 -> n - 1]中的所有元素都大于array[i -> j]中的任何一个即可。最后我们只需要对sorted_array[i -> j]中的元素进行排序即可,这个数组比较小,排序的代价比排序原数组的代价低多了。

        现在问题的关键转化为,对于一个无序数组,array[0 -> n - 1], 给定一个i(0 <=i < n - 1),  怎么样快速地将其partition为三部分array[0 -> i - 1], a[i], a[i + 1 -> n -1],其中array[0 -> i - 1]中的所有元素小于array[i], array[i + 1 -> n - 1]中的所有元素大于a[i]。如果有这样的方法,

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值