(我的第一篇博客,虽然转载的是书上的内容)
快速排序是一种分治排序算法。
(1)首先选取一个划分元素(pivot)
(2)重排列表,将其划分为三个部分,即left(小于划分元素pivot的部分),pivot(划分元素),right(大于划分元素pivot)的部分
此时,划分元素pivot已经在列表的最终位置上了
(3)分别对left和right两部分进行递归排序
快速排序算法的优点是原位排序(只是用很小的辅助栈)但其缺点在于不稳定。
#_*_coding:UTF-8_*_
def quicksort(L):
qsort(L,0,len(L)-1)
def qsort(L,first,last): #这里是递归函数
if first<last:
split=partition(L,first,last)
qsort(L,first,split-1)
qsort(L,split+1,last)
def partition(L,first,last):
#选取列表中第一个元素作为划分元素
pivot=L[first]
leftmark=first+1
rightmark=last
while True:
#如果列表中存在与划分元素piovt相等的元素,让它位于left部分
while L[leftmark]<=pivot:
#检测用于划分元素piovt是列表中最大的元素时,防止leftmake越界
if leftmark==pivot:
break
leftmark+=1
while L[rightmark]>pivot:
#这里不需要做检测,划分元素piovt是列表中最小元素时,rightmake自动停在first处
rightmark-=1
if leftmark<rightmark:
#此时,leftmake处的元素大于pivot,rightmake处的元素小于pivot,交换两者
L[leftmark],L[rightmark]=L[rightmark],L[leftmark]
else:
break
L[first],L[rightmark]=L[rightmark],L[first]
#返回划分元素piovt最终位置
return rightmark
num_list=[3,67,1,7,-1,-43,436]
print ("排序前:"+str(num_list))
quicksort(num_list)
print("排序后:"+str(num_list))
最后忠告:缩进中的制表符和空格一定要一致
缩进中的制表符和空格一定要一致
缩进中的制表符和空格一定要一致