优化快速排序的几个方法

普通的快排方法对于随机数组来说是挺快的,但是当遇到已经排好序的数组,复杂度马上就降为O(n^2)了。


所以我们需要对其进行优化。首先产生这种情况的原因是什么?是基数,当一个已经排好序的数组,我们所选的基数要么最大,要么最小,这就使得在排序过程中耗费了大量时间,那么如何筛选基数?

方法一:随机数产生区间内的某个数。


方法二:在划分算法上进行优化。


我们将同时从两端进行遍历,将需要的值进行交换即可。

方法三:短区间进行选择排序。


考虑到选择算法的最优时间是O(n),也就是对于已经近似排序好的数组,耗费的时间接近于遍历一次的时间。

方法四:考虑到随机数耗费的时间比较多,所以更好的做法就是我们人工筛选基数。
将要排序的区间进行分段。
当区间长度小于 7 时,我们采用选择排序;
当区间长度小于 40 时,我们将区间分成两段,得到左端点、右端点和中点,我们对这三个点取中数作为基数;
当区间大于等于 40 时,我们将区间分成 8 段,得到左三点、中三点和右三点,分别再得到左三点中的中数、中三点中的中数和右三点中的中数,再将得到的三个中数取中数,然后将该值作为基数。
具体代码只是在上一份的代码中加个筛选中数函数即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值