简介
快速排序(Quicksort)是对冒泡排序的一种改进。
快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
以上内容摘自:百度百科
代码
Java版
private static final void sort(int[] array, int left, int right) {
if (left >= right) {
return;
}
// 选择一个支点,用于作为中心点,取左边第一个元素(左边的空位)
int pivot = array[left];
// low 指向了这个空位
int low = left;
int high = right;
while (low < high) {
// 从右向左遍历,当元素比支点大时,持续遍历,直到找到比支点小的元素
while (low < high && pivot <= array[high]) {
high--;
}
// 此时 high 指向的元素比支点小,应交换到左边的空位上,交换后 high 指向的位置将成为空位
array[low] = array[high];
// 从左向右遍历,当元素比支点小时,持续遍历,直到找到比支点大的元素
while (low < high && pivot >= array[low]) {
low++;
}
// 此时 low 指向的元素比支点大,应交换到右边的空位上,交换后 low 指向的位置将成为空位
array[high] = array[low];
}
// 此时 low == high,该点为支点元素的位置
array[low] = pivot;
// 采用递归方式,将支点左边、右边的列表分别执行同样操作
sort(array, left, low - 1);
sort(array, low + 1, right);
}
int[] array = {27, 12, 36, 12, 24, 68, 59, 91, 45};
sort(array, 0, array.length - 1);
Python版
def quick_sort(lst, left, right):
'''
快速排序
:param lst:
:param left:
:param right:
:return:
'''
if left >= right:
return
pivot = lst[left]
low = left
high = right
while low < high:
# 先从右向左,是因为第一个空位在左边(支点位置)
# 从右向左比较,直到找到元素值比支点大的(需要放在支点左边)
while low < high and pivot <= lst[high]:
high -= 1
# 此时 high 指向元素应放在支点左边空位上,然后 high 即为空位
lst[low] = lst[high]
# 从左向右比较,直到找到元素值比支点小的(需要放在支点右边)
while low < high and pivot >= lst[low]:
low += 1
# 此时 low 指向元素应放在支点右边空位上,然后 low 即为空位
lst[high] = lst[low]
# 此时 low == high,为支点值,支点此时正好放在正确的位置上了(无论升序还是降序,其所在位置都是正确的)
lst[low] = pivot
quick_sort2(lst, left, low - 1)
quick_sort2(lst, low + 1, right)
lst = [27, 12, 16, 32, 71, 69, 21, 12, 44]
quick_sort(lst, 0, len(lst) - 1)
结语
对于快速排序算法来说,实际上大量的时间都消耗在了分区上面,因此一个好的分区实现是非常重要的。通常来说快速排序的其它几个变种都是在优化分区这一块,而且快速排序对较小数量规模的列表排序性能并不很高,所以也有结合其它排序算法实现整个排序过程的,典型的有使用快速排序对目标列表排序,当其接近有序时(此时每个分区的数据规模已经很小),停止快速排序,对接近有序的列表进行插入排序,而插入排序对于基本有序的列表有着接近线性的复杂度,这比完全使用快速排序完成排序的方式性能要更好一些。
网友评论