思路:
- 初始化 pivot
- 将小于pivot的数值移动到左边,大于pivot的数值移动到右边
- pivot-1就是递归左边的right,pivot+1就是递归右边的right
- 将左边排序好之后,排序右边(二叉树前序遍历原理一样)
def quickSort(array, left, right):
# 当只len(array) 等于 1,不需要排序
if len(array) == 1:
return array
# “if left < right:” 这个是终止条件
# 因为我们有pi的数值,当第一个分支不满足,即
# quickSort(array, left, pivotIndex - 1)的left >= right
# 那么尝试进入第二个quickSort,即
# quickSort(array, pivotIndex + 1, right)
# 判断是否满足 left < right
# 如果都不满足,可能就会像前序遍历二叉树那样,会往上一层去判断,依次判断最终输出结果
if left < right:
# 类似于二叉树的前序遍历
pivotIndex = partition(array, left, right)
# 从pivot中间分叉,pivot两边分别代表下一个分叉的right和left
quickSort(array, left, pivotIndex - 1)
quickSort(array, pivotIndex + 1, right)
print("test")
def partition (array, left, right):
# 初始化pivot, 假设所有的初始化pivot都是array的最后一位
pivot = array[right]
# 初始化计数器(1.用于和小于pivot的交换;2.用于最终和末尾的pivot交换位置)
# i = 0
# 改进: i必须比j再往前一位,不然遇到第一个比pivot小的不好交换
i = left - 1
# 遍历array用于i和j交换位置,将比pivot小的放在前面
for j in range (left, right):
# if array[j] < pivot:
# if array[j] < pivot: 应该考虑相等也可以
if array[j] <= pivot:
# i += 1
i = i + 1
array[j], array[i] = array[i], array[j]
# 遍历结束后,将pivot和i的位置交换,就得到了最终pivot的位置,pivot的作用就是分割比它大的和比它小的
array[right], array[i+1] = array[i+1], array[right]
# renturn i + 1
return (i+1)
if __name__ == "__main__":
array = [1,10,2,20,3,30,4,40,6]
n = len(array)
# array = quickSort(array, 0, len(array)-1)
# array = quickSort(array, 0, n-1) reuturn None
quickSort(array, 0, n-1)
print(array)
代码来源:
geeksforgeeks
视频解析(快排开始于00.40):
BiliBili