zoukankan      html  css  js  c++  java
  • 算法_快速排序

    '''
    Python 快速排序
    快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为较小和较大的2个子序列,然后递归地排序两个子序列。
    步骤为:
    挑选基准值:从数列中挑出一个元素,称为"基准"(pivot);
    
    分割:重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(与基准值相等的数可以到任何一边)。在这个分割结束之后,对基准值的排序就已经完成;
    递归排序子序列:递归地将小于基准值元素的子序列和大于基准值元素的子序列排序。
    递归到最底部的判断条件是数列的大小是零或一,此时该数列显然已经有序。
    '''
    
    
    # 子序列排序
    def partition(arr, low, high):
        i = (low - 1)  # 最小元素索引,最开始-1
        pivot = arr[high]  # 基准值
    
        for j in range(low, high):
    
            # 当前元素小于或等于 pivot
            if arr[j] <= pivot:
                i = i + 1  # 从0开始
                arr[i], arr[j] = arr[j], arr[i]  # 交换元素位置
                print(arr)
    
        arr[i + 1], arr[high] = arr[high], arr[i + 1]  # for循环结束后交换元素位置,基准值放到中间位置
        return (i + 1)
    
    
    # arr[] --> 排序数组
    # low  --> 起始索引
    # high  --> 结束索引
    
    # 快速排序函数
    def quickSort(arr, low, high):
        if low < high:
            pi = partition(arr, low, high)
            print(arr)
    
            quickSort(arr, low, pi - 1)  # 排序
            print(arr)
            quickSort(arr, pi + 1, high)
            print(arr)
    
    
    arr = [10, 7, 3, 8, 2, 9, 1, 5]
    n = len(arr)
    quickSort(arr, 0, n - 1)
    print("排序后的数组:", arr)  # -->排序后的数组: [1, 5, 7, 8, 9, 10]

    分析(递归过程):

  • 相关阅读:
    OpenCV-Python 模板匹配 | 三十一
    OpenCV-Python 傅里叶变换 | 三十
    OpenCV-Python 直方图-3:二维直方图 | 二十八
    OpenCV-Python 直方图-4:直方图反投影 | 二十九
    角谷猜想
    C# Notepad++ 环境配置
    C++ Notepad++ 环境配置
    字符串内无重复字符的最长子串长度
    计算给定字符串的无重复字符的最长子串长度
    黑色星期五
  • 原文地址:https://www.cnblogs.com/coloz/p/11065434.html
Copyright © 2011-2022 走看看