算法是独立存在的一种解决问题的方法和思想。对于算法而言,用何种语言实现它并不重要,重要的是其思想。
快速排序的思想
快速排序(英语: Quicksort) ,又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序挂程可以递归进行,以此达到整个数据变成有序序列。
- 快速排序其实就是‘分治法’
的一种体现,他将原本一个大问题分割成了两个小问题(比基准值小的数和比基准值大的数) - 然后对子问题依然使用此方法进行划分成更小的问题。当所有的子问题排序完成,把他们合并成一个数列,那么原来的数列也就排序完成了。
快速排序的步骤
- 从数列中挑出一个元素,称为基准 (pivot)元素。
- 重新排序数列,所有元索 比基准值小的摆放在基准前面,所有元素比基准 值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作
- 递归地(recursive) 把小于基准值元素的子数列和大于基准值元素的子数列排序。
Python代码的实现
def quick_sort(alist,start,end):
'''
快速排序的实现 升序排序 使用 递归
:param alist: 需要排序的 序列
:param start: 起始位置
:param end: 终止位置
:return:
'''
# 定义两个游标 分别是数列的起始位置和末尾位置
left = start
right = end
# 定义递归出口 若是左边的游标比右边的大 则表示 递归结束
if start >= end:
return
# 定义一个变量暂时存放基准元素 设置 基准元素一般为 序列的第一个元素
pro = alist[start]
while left < right:
# 先从 right 游标开始移动 找到第一个 比基准元素小的位置停止
while left < right and alist[right] >= pro:
right -= 1
# 循环结束后 就代表找到了 比基准元素小的数
alist[left] = alist[right]
while left < right and alist[left] < pro:
left += 1
alist[right] = alist[left]
# 循环结束后 此时left所在位置即为 基准元素 在的位置
alist[left] = pro
# 使用 递归 在对基准元素 两边的序列 进行快速排序
quick_sort(alist,start,left-1)
quick_sort(alist,left+1,end)