实现升序排序的 python 代码
def sort(nums):
quit_sort(nums, 0, len(nums) - 1)
return nums
def quit_sort(nums, l, r):
if r <= l:
return
# 现在左右两边找到分割点,使得分割点左边都比较小,分割点右边都比较大
j = partition(nums, l, r)
quit_sort(nums, l, j - 1)
quit_sort(nums, j + 1, r)
def partition(nums, l, r):
i = l + 1
j = r
v = nums[l]
while True:
# 向右遍历,找到大于 v 的值索引,需要排除等于的情况
while nums[i] <= v:
i += 1
if i == r:
break
# 向左遍历,找到 小于 v 的值的索引,需要排除等于的情况
while v < nums[j]:
j -= 1
if j == l:
break
# 如果相遇过,则退出
if i >= j:
break
# 否则交换
nums[i], nums[j] = nums[j], nums[i]
# 最后把 对比元素 v 放在 j 的位置上。Q:为什么不放在 i 的位置上
# 因为 j 指向小于 v 的位置,根据 左小右大 的原则,把 v 放在 j 的位置更好
nums[l], nums[j] = nums[j], nums[l]
return j
双指针的滑动逻辑和过程
选取第一个元素 v 作为基准, i i i 从左向右滑动,直到找到大于 v 的位置, j j j 从右向左滑动,直到找到 小于 v 的位置,如果此时 i i i 和 j j j 还未相遇,则交换两者的值,然后 i i i 继续寻找下一个大于 v 的位置,j 继续寻找下一个小于 v 的位置, 当 i i i 和 j j j 相遇后,即 i ≥ j i \geq j i≥j 时,则停止,此时 j j j 指向了小于 v 的位置,而我们做的是升序排序,所以 v 和 j 指向的位置的值进行交换,能把更小的值放在前面。完成这一阶段的排序。此时 v 已经在他正确的位置了,因为左边的值都比他小,右边的值都比他大,最后以 j 为分割点,递归排序左边和右边即可完成整个数组的排序