快排原理介绍
快排采用分治的方法,将一个待排序的数组不断分割成更小的数组,直到小数组的长度为一
- 当长度为一时,本身即有序,则返回
- 将数组不断分割的过程中,本身也存在排序,此时的排序是非完全排序,直到分割到最小长度数组时,才达到完全有序
代码实现
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
- quick_sort(nums)接收一个数组作为参数,这是对外直接暴露的方法,方便调用
- do_quick_sort该函数实现将数组nums不断分割成小数组,直到left==right,此时说明长度为一,即不再分割
- partition该方法是快排中最重要的一步
- 取一个基准值pivot(此处为子数组的第一个元素)
- 找到该基准值排序后存放位置的下标
- 将子数组中所有比该基准大的值,放到基准值右侧
- 将子数组中所有比该基准大的值,放到基准值左侧
- 所以子数组重复执行第3步,最终达到有序