快速排序的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 # 从最后一个元素开始遍历
# 循环将小于基准值的元素放到左边,大于基准值的元素放到