快速排序
(英语:Quicksort),又称为交换排序。
通过初始的排序将要排序的数据分割为独立的两部分。
假设要排序的列表是 (A[0]……A[N-1]),首先任意选取一个数据(通常选用列表的第一个数)作为基准数据,然后将所有比它小的数都放到它左边,所有比它大的数都放到它右边,这个过程称为一次快速排序。
快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
步骤(参考1)
(1) 设置两个变量 left、right,排序开始的时候:left=0,right=N-1;
(2) 以第一个列表元素作为基准数据,赋值给 mid,即 mid=A[0];
(3) 从 right 开始向前搜索,即由后开始向前搜索(right–),找到第一个小于 mid 的值A[right],将 A[right]和 A[left]的值交换;
(4) 从left开始向后搜索,即由前开始向后搜索(left++),找到第一个大于 mid 的A[left],将 A[left]和 A[right]的值交换;
(5 ) 重复第 3、4 步,直到 low=high
步骤(参考2)
def qukic_sort(colist,l,r):#'导入参数为(list,0,len(list)-1)'
# 退出条件
if l>=r:
return
'设定起始元素(基准元素mid)'
mid=colist[l]
left=l
right=r
while left<right:
'如果left与right没有重合,且right指向的元素不小于基准元素,则right向左移动'
while left<right and colist[right]>=mid:
right-=1
'将r指针所在的元素放到l的位置上'
colist[left]=colist[right]
# print(colist)
'如果r与l没有重合,且left指向的元素比基准元素小,则left向右移动(即比mid小的都在左侧不变)'
while left<right and colist[left]<mid:
left+=1
colist[right]=colist[left]
# print(colist)
'''解释说明操作
导入列表a=[123,12,15,648,46,6,464,1]
》》 a=[123,12,15,648,46,6,464,1(当前右侧判断位置)]
123是基准mid
从右边开始比较,1小于123,应该位于基准的左侧,交换位置,开始判断左侧数据=======
》》a=[1,12,15,648,46,6,464,1]
然后,从左侧开始,1小于mid123,不变,12小123,不变,15也是不变,
然后648大于123,交换位置===========
》》 a=[1,12,15,648(当前左侧判断位置),46,6,464,648]
然后从右侧开始判断,648大于123,464大于123,不变,然后6小于123,变换===========
》》 a=[1,12,15,6(左侧位置),46,6(右侧当前判断位置),464,648]
然后46小于123,不变,左右判断都到了46右侧的6==========
'''
'当l=r的时候,退出循环'
colist[left]=mid
' 然后a=[1,12,15,6,46,123,464,648] '
'对基准元素左侧的子序列排序'
qukic_sort(colist,l,left-1)
'对基准元素右边的子序列进行排序'
qukic_sort(colist,left+1,r)