快速排序
快速排序的基本思路是,通过partition操作,将数字划分为小于等于部分和大于部分,对于这个两个部分,再次分别进行partition,直到不能再分
在快速排序中,最核心的部分就是partition,在这里记录一下我理解partition的过程,partition有多种方法,我使用的是快慢指针的方法。
def partition(arr, l, r):
# 以最后一个元素为基准,将[l,r]划分为两部分
pivot = arr[r]
# 慢指针 指向>=区域的第一个元素
slow = l
# 快指针 指向>=区域的最后一个元素
for fast in range(l, r + 1):
# 当快指针指向的元素小于pivot时,将其移动到大于区域的前面
if arr[fast] < pivot:
arr[slow], arr[fast] = arr[fast], arr[slow]
slow += 1
# 将pivot换到slow位置
arr[slow], arr[r] = arr[r], arr[slow]
return slow
在上面的代码中,我们定义了两个指针,slow和fast,可以看到,fast指针每次都加1,slow指针有时候加1。随着for循环的执行,fast指针会比slow指针更快的向前移动,代码通过控制fast和slow的移动以及交换元素,使得[slow, fast]
这个区间中的元素都是>=pivot。
在for循环之后,我们将pivot换到slow位置,也就是[slow, fast]
这个区间的第一个位置。
这样,我们将[l, slow-1]
区间都换成了比pivot更小的元素,将[slow+1, r]
区间换成了比pivot更大的元素。
最后附上利用partition将排序的代码
def sort_(arr, l, r):
if l >= r:
return
m = partition(arr, l, r)
sort_(arr, l, m - 1)
sort_(arr, m + 1, r)
标签:arr,slow,partition,fast,pivot,排序,快速,指针
From: https://www.cnblogs.com/mengzhuo/p/17694278.html