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]

  • 相关阅读:
    python的垃圾回收机制
    生成器
    装饰器
    模块与包
    MES实施会有哪些情况?为你介绍两种常见的类型
    中国智慧工厂未来发展及趋势几何?这里给你讲个清楚
    未来智能工厂是什么样?这五种产业必不可少
    制造企业非常头疼的插单问题,本文给你这些实用建议,第7点最具价值
    MES选型很困惑?避开这三个禁忌!
    如何适应应用场景?高级排程系统的功能如此强大!
  • 原文地址:https://www.cnblogs.com/ybf-yyj/p/7592914.html
Copyright © 2011-2022 走看看