快速排序+随机快排
#-*- coding:utf-8 -*- def quickSort(low,hight,list): if (low>hight): return j=hight i=low temp=list[low] while i!=j: while list[j]>=temp and i<j: j-=1 while list[i]<=temp and i<j: i+=1 if i<j: k=list[i] list[i]=list[j] list[j]=k list[low]=list[i] list[i]=temp print list quickSort(low,i-1,list) quickSort(i+1,hight,list) return
low=0
list=[5,8,9,2,1,9,6,5]
hight=len(list)-1
quickSort(low,hight,list)
以上为普通的快速排序,用python实现,但是以上的快排还是有一些问题的:
快排算法的基数选择为最左边的数,当数组左边的数一直是最小的数,则整个排序过程则非常不平衡
解决思路:
将随机数性算法加入快排,即基数的选择随机,并不是特定的选择,这样可以避免块排的最坏情况
以下为改进的块排
#-*- coding:utf-8 -*- import datetime import random random.seed(datetime.datetime.now()) #随机取数恢复数组 def _list(low,rd,list): for i in range(0,rd-low): list[rd]=list[rd-1] rd=rd-1 def quickSort(low,hight,list): if (low>=hight): return rd=random.randint(low,hight) #存储选择的数 temp1 = list[rd] _list(low,rd,list) #将选择的数放在第一个数 list[low]=temp1 #按照快排进行取第一个数 temp=list[low] j=hight i=low while i!=j: while list[j]>=temp and i<j: j-=1 while list[i]<=temp and i<j: i+=1 if i<j: k=list[i] list[i]=list[j] list[j]=k list[low]=list[i] list[i]=temp print list quickSort(low,i-1,list) quickSort(i+1,hight,list) return
low=0
list=[5,8,9,2,1,9,6,5]
hight=len(list)-1
quickSort(low,hight,list)
以下为两种最坏情况下的快排的运行:
常规的块排:
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
[1, 9, 8, 7, 6, 5, 4, 3, 2, 10]
[1, 9, 8, 7, 6, 5, 4, 3, 2, 10]
[1, 2, 8, 7, 6, 5, 4, 3, 9, 10]
[1, 2, 8, 7, 6, 5, 4, 3, 9, 10]
[1, 2, 3, 7, 6, 5, 4, 8, 9, 10]
[1, 2, 3, 7, 6, 5, 4, 8, 9, 10]
[1, 2, 3, 4, 6, 5, 7, 8, 9, 10]
[1, 2, 3, 4, 6, 5, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
改进的块排:
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
[4, 1, 2, 3, 5, 6, 7, 8, 9, 10]
[1, 4, 2, 3, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 8, 6, 7, 9, 10]
[1, 2, 3, 4, 5, 7, 6, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]