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]

  • 相关阅读:
    Codeforces1335F Robots on a Grid
    BJOI2014 大融合
    洛谷 P1463 [SDOI2005]反素数ant && codevs2912反素数
    codeforce 570 problem E&& 51Nod-1503-猪和回文
    洛谷noip 模拟赛 day1 T1
    noip 2010 三国游戏
    noip 2013 华容道
    汕头市队赛 SRM 07 D 天才麻将少女kpm
    noip2012 普及组
    汕头市队赛 SRM 08 B
  • 原文地址:https://www.cnblogs.com/ybf-yyj/p/7592914.html
Copyright © 2011-2022 走看看