快速排序+随机快排

#-*- 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]

posted @ 2017-09-25 23:46  ybf&yyj  阅读(681)  评论(0编辑  收藏  举报