该代码考虑了快速排序比较多的细节,三数中值分割法选枢纽元,在分割时遇到重复元素的处理,以及当递归中的数组长度小于10以下时采用插入排序。
cutoff=3 #对于个数小于cutoff的小数组采用插入排序
def Insertsort(a,left,right):
for i in range(left,right+1):
cur=a[i]
j=i
while j>left and cur<a[j-1]:
a[j]=a[j-1]
j-=1
a[j] = cur
def Quicksort(a,left,right):
if left+cutoff<right:
pivot=median3(a,left,right)
i=left
j=right-1
temp=0
while i<j:
i+=1
while a[i]<pivot:
i+=1
j-=1
while a[j]>pivot:
j-=1
if i<j:
temp=a[i]
a[i]=a[j]
a[j]=temp
temp=a[i]
a[i]=a[right-1]
a[right-1]=temp
Quicksort(a,left,i-1)
Quicksort(a,i+1,right)
else:
Insertsort(a,left,right)
def median3(a,left,right):
center=(left+right)//2
temp=0
if a[center]<a[left]:
temp=a[center]
a[center]=a[left]
a[left]=temp
if a[right]<a[left]:
temp=a[right]
a[right]=a[left]
a[left]=temp
if a[right]<a[center]:
temp=a[right]
a[right]=a[center]
a[center]=temp
temp=a[center]
a[center]=a[right-1]
a[right-1]=temp
return a[right-1]
a=[65,58,95,10,57,62,13,106,78,23,85]
Quicksort(a,0,len(a)-1)
print(a)