优化快速排序的几个方法

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


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

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


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


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

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


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

方法四:考虑到随机数耗费的时间比较多,所以更好的做法就是我们人工筛选基数。
将要排序的区间进行分段。
当区间长度小于 7 时,我们采用选择排序;
当区间长度小于 40 时,我们将区间分成两段,得到左端点、右端点和中点,我们对这三个点取中数作为基数;
当区间大于等于 40 时,我们将区间分成 8 段,得到左三点、中三点和右三点,分别再得到左三点中的中数、中三点中的中数和右三点中的中数,再将得到的三个中数取中数,然后将该值作为基数。
具体代码只是在上一份的代码中加个筛选中数函数即可。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章