一、快速排序思想
如果要排序数组中下标从 p 到 r 之间的一组数据,我们选择 p 到 r 之间的任意一个数据作为 pivot(分区点)。我们遍历 p 到 r 之间的数据,将小于 pivot 的放到左边,将大于 pivot 的放到右边,将 pivot 放到中间。经过这一步骤之后,数组 p 到 r 之间的数据就被分成了三个部分,前面 p 到 q-1 之间都是小于 pivot 的,中间是 pivot,后面的 q+1 到 r 之间是大于 pivot 的。
二、步骤归纳
1.排序数组为collection,游标left从a的最左边开始,游标right从最右边开始
2.把pivot记为数组第一个数(即collection[left]),作为数组左右的分界值
3.从右边开始向左移动游标(right = right - 1)直到找到第一个小于pivot的数,存储在collection[left]当中
4.从左边开始向右移动游标(left = left + 1)直到找到第一个大于pivot的数,存储在collection[right]当中
5.重复上述两步直到两个游标相遇
6.将pivot放置到collection[left]位置上
7.随后递归地将pivot左右两部分分别排序!(递归)
三、Python实现示例
def quick_sort(collection, low, high):
# 快速排序
if low >= high:
return collection
else:
pivot = collection[low] # 把第一个作为基准值
left = low
right = high
while left < right:
while left < right and collection[right] >= pivot:
right -= 1 # 右边的哨兵左移一个
collection[left] = collection[right]
while left < right and collection[left] <= pivot:
left +=1 # 左边的哨兵右移一个
collection[right] = collection[left]
collection[right] = pivot # 两个哨兵相遇时则说明找到基准值的位置
quick_sort(collection, low, left-1) # 递归左半部分
quick_sort(collection, left+1, high) # 递归右半部分
return collection
if __name__ == '__main__':
collection = list(map(int, input().split()))
print('排序前:', end='')
for i in collection:
print(i, end=' ')
collection = quick_sort(collection, 0, len(collection)-1)
print('\n排序后:', end='')
for i in collection:
print(i, end=' ')
本文详细介绍了快速排序算法的核心思想,包括如何选择分区点,遍历数组并进行数据划分的过程,以及递归排序左右子数组的步骤。并通过Python代码实现了快速排序算法。
400

被折叠的 条评论
为什么被折叠?



