pygorithm/sort/quick_sort.py

46 lines
1.4 KiB
Python
Raw Permalink Normal View History

2023-12-11 18:17:16 +08:00
"""
核心将小于基准的数移到左边将大于基准的数移到右边再对左右分区继续执行快速排序
1. 选择列表中的一个数作为基准一般是第一个元素
2. 设置左右两个指针分别指向第一个元素和最后一个元素
3. 向左移动右指针若发现比基准值小的值则将其与基准值交换
4. 接着向右移动左指针若发现比基准值大的值则将其与基准值交换
5. 重复 3, 4直到 左右指针相遇
6. 最后基准值所在的位置左边都比其小右边都比其大
7. 再对左右区域指向快排
复杂度为 O(n^2)
"""
def quick_sort(nums: list[int], low: int, high: int):
i = low
j = high
# 一开始的基准值为 nums[i]
if low >= high:
return
while i < j:
while i < j and nums[j] >= nums[i]:
j -= 1
if i < j:
# 交换后基准值移到右边
nums[i], nums[j] = nums[j], nums[i]
i += 1
while i < j and nums[i] < nums[j]:
i += 1
if i < j:
# 交换后基准值移到左边
nums[j], nums[i] = nums[i], nums[j]
j -= 1
# 基准值位置是i所以 low 到 i-1 是小区基准值的区域
quick_sort(nums, low, i - 1)
#
quick_sort(nums, j + 1, high)
nums = [47, 29, 71, 99, 78, 19, 24, 47]
quick_sort(nums, 0, len(nums)-1)
print(nums)