• 快速排序+随机快排


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

  • 相关阅读:
    一探前端开发中的JS调试技巧(转)
    JavaScript模板引擎实例应用(转)
    本周汇总
    完美解决IE8不支持margin auto问题
    移动端H5适配流程
    原型继承
    每周笔记
    一个页面多个bootstrip轮播以及一个页面多个swiper轮播 冲突问题
    如何让整个网页倾斜
    前端知识体系
  • 原文地址:https://www.cnblogs.com/ybf-yyj/p/7592914.html
Copyright © 2020-2023  润新知