概念
问题描述
给定无序数组,将数组按从小到大的顺序排列。
算法思想
使用分治的思想,首先将一个数组分为两个子数组,将两部分独立地排序。切分的方法是,首先选定一个切分元素,然后从数组的左端开始向右扫描,找到一个大于等于它的元素,再从数组的右端开始向左扫描,找到小于等于它的元素,交换位置。这样扫描完数组之后,切分元素的左子数组均比切分元素小,右子数组均比切分元素大,而切分元素位于中间位置。再运用递归的思想分别对左子数组与右子数组进行快速排序,最终得到有序的数组。
图解
代码实现
clojure
1 | (defn get-list [items x y] |
java
1 | /** |
特点
- 快排算法的排序效率依赖于切分数组的效果,而这依赖于切分元素的值。最好的情况是每次都能将数组对半分。
- 快速排序有一个潜在的缺点,如果第一次从最小元素切分,第二次从最小元素切分,那么数组每次调用只会移除一个元素。为了尽可能避免这种情况,可以在快速排序前将数组随机排序,使产生糟糕切分的可能性降到极低。
参考文档
《算法》