日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

基數排序(python)

系統 1988 0

10.基數排序

10.1 算法思想

基數排序是對桶排序的擴展。
第一類:最低位優先法,簡稱LSD法:先從最低位開始排序,再對次低位排序,直到對最高位排序后得到一個有序序列;
第二類:最高位優先法,簡稱MSD法:先從最高位開始排序,再逐個對各分組按次高位進行子排序,循環直到最低位。(位沒有數的話,補0)
這里以LSD為例,由于待排序元素每一位上的數字的取值范圍是0—9,因此每按照某一位,需要10個桶,這樣每一位上相同的數字會分配到一個桶里。

10.2 算法過程

基數排序(python)_第1張圖片
假設有一未排序數組:
3,44,38,5,47,15,36,26,27,2,46,4,19,50,48
首先根據個位數的數值,在遍歷數值時將它們分配至編號0到9的桶中:
0:50
1:
2: 2
3: 3
4: 44,4
5: 5,15
6:36,26,46
7:47,27
8:38,48
9:19,
第二步
接下來將這些桶中的數值重新串接起來,成為以下的數列:
50,2,3,44,4,5,15,36,26,46,47,27,38,48,19
接著再進行一次分配,這次是根據十位數來分配:
0:2,3,4,5
1:15,19
2:26,27
3:36,38
4:44,46,47,48
5:50,
6:
7:
8:
9:
第三步
接下來將這些桶子中的數值重新串接起來,成為以下的數列:
2,3,4,5,15,19,26,27,36,38,44,46,47,48,50
這時候整個數列已經排序完畢。
如果排序的對象有三位數以上,則持續進行以上的動作直至最高位數為止。

10.3 python代碼

            
              
                def
              
              
                getbit
              
              
                (
              
              num
              
                ,
              
              i
              
                )
              
              
                :
              
              
                # 獲取元素第i位的數
              
              
                return
              
              
                (
              
              num 
              
                %
              
              
                (
              
              i 
              
                *
              
              
                10
              
              
                )
              
              
                -
              
              
                (
              
              num 
              
                %
              
               i
              
                )
              
              
                )
              
              
                //
              
               i

              
                def
              
              
                getMax
              
              
                (
              
              numList
              
                )
              
              
                :
              
              
                # 獲取數組中的最大值
              
              
                if
              
              
                len
              
              
                (
              
              numList
              
                )
              
              
                ==
              
              
                1
              
              
                :
              
              
                return
              
               numList
              
                [
              
              
                0
              
              
                ]
              
              
    maxNum 
              
                =
              
               numList
              
                [
              
              
                0
              
              
                ]
              
              
                for
              
               i 
              
                in
              
              
                range
              
              
                (
              
              
                len
              
              
                (
              
              numList
              
                )
              
              
                )
              
              
                :
              
              
                if
              
               numList
              
                [
              
              i
              
                ]
              
              
                >
              
               maxNum
              
                :
              
              
            maxNum 
              
                =
              
               numList
              
                [
              
              i
              
                ]
              
              
                return
              
               maxNum

              
                def
              
              
                radixSort
              
              
                (
              
              numList
              
                )
              
              
                :
              
              
                if
              
              
                len
              
              
                (
              
              numList
              
                )
              
              
                ==
              
              
                0
              
              
                or
              
              
                len
              
              
                (
              
              numList
              
                )
              
              
                ==
              
              
                1
              
              
                :
              
              
                return
              
               numList
    maxNum 
              
                =
              
               getMax
              
                (
              
              numList
              
                )
              
              
    bitCount 
              
                =
              
              
                0
              
              
    index 
              
                =
              
              
                1
              
              
                while
              
               maxNum 
              
                //
              
               index
              
                :
              
              
        bitCount 
              
                +=
              
              
                1
              
              
        index 
              
                *=
              
              
                10
              
              
    currentBit 
              
                =
              
              
                1
              
              
                # 統計一下最大值的bitCount(有多少位),因為比較多少次,是有最大值的位數決定的
              
              
                while
              
               currentBit 
              
                <=
              
              
                10
              
              
                **
              
              
                (
              
              bitCount
              
                -
              
              
                1
              
              
                )
              
              
                :
              
              
                # 開始循環的進行每一個位的比較
              
              
        res 
              
                =
              
              
                [
              
              
                ]
              
              
        buckets 
              
                =
              
              
                [
              
              
                [
              
              
                ]
              
              
                for
              
               i 
              
                in
              
              
                range
              
              
                (
              
              
                10
              
              
                )
              
              
                ]
              
              
                # 桶排序
              
              
                for
              
               i 
              
                in
              
               numList
              
                :
              
              
            currentBitNum 
              
                =
              
               getbit
              
                (
              
              i
              
                ,
              
              currentBit
              
                )
              
              
            buckets
              
                [
              
              currentBitNum
              
                ]
              
              
                .
              
              append
              
                (
              
              i
              
                )
              
              
                for
              
               i 
              
                in
              
              
                range
              
              
                (
              
              
                10
              
              
                )
              
              
                :
              
              
                for
              
               j 
              
                in
              
              
                range
              
              
                (
              
              
                len
              
              
                (
              
              buckets
              
                [
              
              i
              
                ]
              
              
                )
              
              
                )
              
              
                :
              
              
                res
              
                .
              
              append
              
                (
              
              buckets
              
                [
              
              i
              
                ]
              
              
                [
              
              j
              
                ]
              
              
                )
              
              
        numList 
              
                =
              
               res
        currentBit 
              
                *=
              
              
                10
              
              
                return
              
               numList
numlist 
              
                =
              
              
                [
              
              
                12
              
              
                ,
              
              
                3
              
              
                ,
              
              
                45
              
              
                ,
              
              
                3543
              
              
                ,
              
              
                214
              
              
                ,
              
              
                1
              
              
                ,
              
              
                4553
              
              
                ]
              
              
                print
              
              
                (
              
              radixSort
              
                (
              
              numlist
              
                )
              
              
                )
              
              
                # 輸出結果為:[1, 3, 12, 45, 214, 3543, 4553]
              
            
          

更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 余姚市| 石嘴山市| 湟中县| 丹江口市| 阿尔山市| 开封市| 康定县| 聂荣县| 云南省| 安西县| 湾仔区| 瑞丽市| 邵阳市| 兴国县| 出国| 郴州市| 万载县| 河间市| 许昌市| 绥棱县| 寿光市| 阿克陶县| 青神县| 五台县| 甘洛县| 杭锦后旗| 新和县| 德化县| 尼木县| 遂宁市| 应用必备| 翁牛特旗| 华阴市| 渭南市| 彭州市| 商河县| 九江县| 连城县| 嘉黎县| 松阳县| 木兰县|