快速排序

快速排序

快速排序的基本思路是,通过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)
posted @ 2023-09-11 19:11  完美二叉树  阅读(71)  评论(0)    收藏  举报