美文网首页
多语言版快速排序

多语言版快速排序

作者: ed72fd6aaa3c | 来源:发表于2018-07-24 11:12 被阅读6次

    简介

    快速排序(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://www.haomeiwen.com/subject/tujemftx.html