快速排序
快速排序的思路是依据一个中值数据项来把数据表分为两半:小于中值的一半和大于中值的一半,然后每部分分别进行快速排序
基本结束条件:数据表仅有一个数据项,自然是排好序的。
缩小规模:根据中值,将数据表分为两半,最好情况是相等规模的两半
调用自身:将两半分别调用自身进行排序
分裂数据表的目标:找到“中值”应处的位置
分裂数据表的手段:
①设置左右标,左标向右移动,右标向左移动,
②左标一直向右移动,碰到比中值大的就停止,右标一直向左移动,碰到比中值小的就停止,然后把左右标所指的数据项交换
③继续前述的移动过程,直到左标移到右标的右侧,停止移动,这时右标所指的位置就是中值应处的位置,将中值和这个位置交换,分裂完成,左半部全比中值小,右半部都比中值大。
代码
def quickSort(alist):
quickSortHelper(alist,0,len(alist)-1)
def quickSortHelper(alist,first,last):
#基本结束条件
if first<last:
#分裂为两部分
splitpoint=partition(alist,first,last)
#递归调用
quickSortHelper(alist,first,splitpoint-1)
quickSortHelper(alist,splitpoint+1,last)
def partition(alist,first,last):
#选定中值
mid=alist[first]
leftmark=first+1
rightmark=last
done=False
while not done:
while leftmark<=rightmark and alist[leftmark]<=mid:
leftmark=leftmark+1
while rightmark>=leftmark and alist[rightmark]>=mid:
rightmark-=1
#两标相错就结束移动
if rightmark<leftmark:
done=True
#左右两标指向的值交换,继续移动
else:
temp=alist[leftmark]
alist[leftmark]=alist[rightmark]
alist[rightmark]=temp
temp2=alist[first]
alist[first]=alist[rightmark]
alist[rightmark]=temp2
return rightmark
alist=[52,312,54,7,3,2]
quickSort(alist)
print(alist)