我在研究三路快速排序时,想出来了一个点子,使得非三路快速排序也可以高效排序大量重复元素的数据。
原理是这样的:
单次排序开始前,先设定一个状态为真
遇到等于基准值的值时,如果状态为真则与小于基准值时做相同的操作,
且无论状态为何值都对其进行取反并赋回原值。
这样可以保证遇到了重复的数据时,重复数据被均匀的分到了基准值两侧,从而避免了大量重复数据带来的严重划分不均匀,并提高了速度,减少了递归深度。
我将其称作交替快排。
以下为 交替快排、三路快排、普通快排 的不同数据情况的速度对比:
运行耗时对比
可以看出,三路快排在处理大量重复数据情况之外的速度有所下降,而交替快排则基本与普通快排相同。
交替快排对完全随机元素进行排序时虽然比普通快排慢一些但是也比三路快排更快。
以下贴出代码:
以下是用来生成随机数组的代码:
所以,似乎交替快排比三路快排更加实用呢!
如果有人有证据证明这种优化方法已经被发明过了,请联系我。
反正我是没搜到这种优化方法。三数取中我没用因为貌似我测的更慢。多线程优化没加。
插排阈值我设置的10。尾递归优化加了,取l与r中间的数做基准值优化加了,很好用。
有序检查优化没加,在我常用的场景不太划算。
不过在已经排好的重复元素多的数组中,再进行排序。
交替快排应该会比三路快排有着更多的交换次数,这倒是可以用交换前先检查值是否相等来解决,不过这样会略慢一些,所以根据需求看你需要减少交换还是提高其它情况下的速度。虽然除了大量重复依旧比三路快排快。
我在Bilibili同步发布了该文章
本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕,E-mail:xinmeigg88@163.com
本文链接:http://www.xrbh.cn/tnews/4957.html