zoukankan      html  css  js  c++  java
  • 快速排序+随机快排

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

  • 相关阅读:
    093孤荷凌寒自学第179天区块链093天Dapp048
    092孤荷凌寒自学第178天区块链092Dapp047
    091孤荷凌寒自学第177天区块链091天Dapp046
    090孤荷凌寒自学第180天区块链090天Dapp045
    089孤荷凌寒自学第175天区块链089天Dapp044
    088孤荷凌寒自学第174天区块链088天Dapp043
    087孤荷凌寒自学第173天区块链087天Dapp042
    孤荷凌寒自学第172天区块链086天Dapp041
    孤荷凌寒自学第171天区块链085天Dapp040
    iOS开发——高级篇——内存分析,Instruments
  • 原文地址:https://www.cnblogs.com/ybf-yyj/p/7592914.html
Copyright © 2011-2022 走看看