快速排序的Python实现

前言

快速排序是一种常用的排序算法,它的核心思想是通过选择一个基准值,将数组分为两部分,一部分小于基准值,一部分大于基准值,然后对这两部分分别进行递归排序。在这篇文章中,我将教会你如何实现快速排序,并给出每一步需要做什么,以及相应的代码和注释。

快速排序流程

下面是快速排序的实现流程,每一步都会对应一段代码和注释,方便你理解。

步骤 操作
1. 选择基准值 从数组中选择一个元素作为基准值,通常选择第一个或最后一个元素。
2. 分区 将数组分为两部分,一部分小于基准值,一部分大于基准值。
3. 递归排序左右两部分 对分区后的左右两部分分别进行递归排序。
4. 合并 将左半部分、基准值、右半部分合并为最终排序结果。

代码实现

选择基准值

在快速排序算法中,我们需要选择一个基准值。常见的选择方式是选择数组的第一个或最后一个元素作为基准值。这里我们选择第一个元素作为基准值。

def partition(arr, low, high):
    pivot = arr[low]  # 将第一个元素作为基准值
    i = low + 1       # 从基准值的下一个元素开始遍历
    j = high          # 从最后一个元素开始遍历

    # 循环将小于基准值的元素放到左边,大于基准值的元素放到右边
    while True:
        # 从左往右找到第一个大于基准值的元素
        while i <= j and arr[i] <= pivot:
            i += 1
        # 从右往左找到第一个小于基准值的元素
        while i <= j and arr[j] >= pivot:
            j -= 1
        # 如果i大于j,则说明已经将所有元素遍历完毕
        if i > j:
            break
        # 交换arr[i]和arr[j]
        arr[i], arr[j] = arr[j], arr[i]
    
    # 将基准值放到正确的位置上
    arr[low], arr[j] = arr[j], arr[low]
    
    # 返回基准值的位置
    return j

分区

在分区步骤中,我们将数组分为两部分,一部分小于基准值,一部分大于基准值。这里我们使用递归的方式分别对左右两部分进行排序。

def quicksort(arr, low, high):
    if low < high:
        # 分区,获取基准值的位置
        pivot_index = partition(arr, low, high)
        
        # 对左半部分进行排序
        quicksort(arr, low, pivot_index - 1)
        
        # 对右半部分进行排序
        quicksort(arr, pivot_index + 1, high)

合并

最后一步是将排序后的左半部分、基准值和右半部分合并为最终的排序结果。在这里,由于我们是原地排序,所以不需要额外的合并操作。

def quicksort(arr):
    quicksort(arr, 0, len(arr) - 1)
    return arr

完整代码

下面是完整的快速排序的Python实现代码:

def partition(arr, low, high):
    pivot = arr[low]  # 将第一个元素作为基准值
    i = low + 1       # 从基准值的下一个元素开始遍历
    j = high          # 从最后一个元素开始遍历

    # 循环将小于基准值的元素放到左边,大于基准值的元素放到