多语言版快速排序

简介

快速排序(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)

结语

对于快速排序算法来说,实际上大量的时间都消耗在了分区上面,因此一个好的分区实现是非常重要的。通常来说快速排序的其它几个变种都是在优化分区这一块,而且快速排序对较小数量规模的列表排序性能并不很高,所以也有结合其它排序算法实现整个排序过程的,典型的有使用快速排序对目标列表排序,当其接近有序时(此时每个分区的数据规模已经很小),停止快速排序,对接近有序的列表进行插入排序,而插入排序对于基本有序的列表有着接近线性的复杂度,这比完全使用快速排序完成排序的方式性能要更好一些。

转载于:https://my.oschina.net/zhanglikun/blog/1861920

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值