快速排序-python实现

118 阅读1分钟

快排原理介绍

快排采用分治的方法,将一个待排序的数组不断分割成更小的数组,直到小数组的长度为一

  • 当长度为一时,本身即有序,则返回
  • 将数组不断分割的过程中,本身也存在排序,此时的排序是非完全排序,直到分割到最小长度数组时,才达到完全有序

代码实现

def quick_sort(nums):
    if len(nums) < 2:
        return nums
    return do_quick_sort(nums, 0, len(nums)-1)


def do_quick_sort(nums, left, right):
    if left < right:
        pivot_index = partition(nums, left, right)

        do_quick_sort(nums, left, pivot_index-1)
        do_quick_sort(nums, pivot_index+1, right)

    return nums


def partition(nums, left, right):
    pivot = nums[left]
    while left < right:
        while left < right and pivot <= nums[right]:
            right -= 1
        nums[left] = nums[right]
        while left < right and nums[left] <= pivot:
            left += 1
        nums[right] = nums[left]
    nums[left] = pivot
    return left
  1. quick_sort(nums)接收一个数组作为参数,这是对外直接暴露的方法,方便调用
  2. do_quick_sort该函数实现将数组nums不断分割成小数组,直到left==right,此时说明长度为一,即不再分割
  3. partition该方法是快排中最重要的一步
    • 取一个基准值pivot(此处为子数组的第一个元素)
    • 找到该基准值排序后存放位置的下标
    • 将子数组中所有比该基准大的值,放到基准值右侧
    • 将子数组中所有比该基准大的值,放到基准值左侧
  4. 所以子数组重复执行第3步,最终达到有序