Python实现快速排序

1. 简介

快速排序(Quicksort)是一种常用的排序算法,它使用分治的思想将一个序列分割成两个子序列,然后对两个子序列分别进行排序,最终将整个序列排好序。

2. 快速排序流程

下面是快速排序的流程图:

flowchart TD
    A(选择基准元素) --> B(将序列分割为两个子序列)
    B --> C(对左子序列进行快速排序)
    B --> D(对右子序列进行快速排序)
    C --> E(合并左子序列和基准元素)
    D --> E
    E --> F(返回排序后的序列)

3. 实现步骤及代码

3.1 选择基准元素

在快速排序中,我们需要选择一个基准元素来将序列分割为两个子序列。通常选择序列的第一个元素作为基准元素。

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
        if i <= j:
            # 交换arr[i]和arr[j]
            arr[i], arr[j] = arr[j], arr[i]
        else:
            break
    # 交换基准元素和arr[j]
    arr[low], arr[j] = arr[j], arr[low]
    return j

3.2 将序列分割为两个子序列

在选择了基准元素后,我们需要将序列按照基准元素分割为两个子序列。比基准元素小的元素放在左边,比基准元素大的元素放在右边。

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)

3.3 合并子序列和基准元素

在完成对左子序列和右子序列的快速排序后,我们需要将子序列和基准元素合并,得到最终的排序结果。

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

4. 示例

假设我们有一个序列 [5, 3, 8, 4, 2],现在我们使用快速排序对其进行排序。

首先,选择基准元素为序列的第一个元素 5。

然后,将序列分割为两个子序列,小于基准元素的放在左边,大于基准元素的放在右边。

子序列左边:[3, 4, 2] 子序列右边:[8]

接下来,对左子序列 [3, 4, 2] 进行快速排序。

选择基准元素为子序列的第一个元素 3。

将子序列分割为两个子序列,小于基准元素的放在左边,大于基准元素的放在右边。

子序列左边:[2] 子序列右边:[4]

对右子序列 [4] 进行快速排序,无需再分割。

合并左子序列、基准元素和右子序列,得到排序后的序列:[2, 3, 4, 5, 8]

5. 总结

快速排序是一种高效的排序算法,它通过分治的思想将一个序列分割为两个子序列,然后对子序列进行递归排序,最终得到整个序列的排序结果