国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python計數(shù)排序和基數(shù)排序算法實例

2020-02-23 05:20:38
字體:
供稿:網(wǎng)友

一、計數(shù)排序

計數(shù)排序(Counting sort)是一種穩(wěn)定的排序算法

算法的步驟如下:
找出待排序的數(shù)組中最大和最小的元素
統(tǒng)計數(shù)組中每個值為i的元素出現(xiàn)的次數(shù),存入數(shù)組C的第i項
對所有的計數(shù)累加(從C中的第一個元素開始,每一項和前一項相加)
反向填充目標數(shù)組:將每個元素i放在新數(shù)組的第C(i)項,每放一個元素就將C(i)減去1
當輸入的元素是 n 個 0 到 k 之間的整數(shù)時,計數(shù)排序的時間復雜度為O(N+K),空間復雜度為O(N+K)。當K不是很大時,這是一個很有效的線性排序算法。

以下是測試代碼:
代碼如下:#-*- coding:utf8 -*-
import random

def jishu(data, max):
    """
    基數(shù)排序:當輸入的元素是 n 個 0 到 k 之間的整數(shù)時(k不能太大,即max不能太大)
    @param data: 需要排序的數(shù)組
    @param max: 最大的數(shù)
    """
    result = [None for i in xrange(len(data))]  # 最后的結(jié)果
    c = [0 for i in range(max+1)]
    # 用數(shù)組c統(tǒng)計每個值=d的元素個數(shù)
    for d in data:
        c[d] = c[d] + 1

    # c[i]表示data中值<=i 的元素個數(shù)
    for i in range(1, max+1):
        c[i] = c[i] + c[i-1]

    # 在將C中的元素倒著打印出來就是排序好的
    for j in xrange(len(data)-1, -1, -1):
        result[c[data[j]]-1] = data[j]
        c[data[j]] = c[data[j]] – 1

    return result

 

if __name__ == '__main__':

    #制造1000個0到100的數(shù)字

    print jishu([random.randint(0, 100) for i in range(1000)], 100)

二、基數(shù)排序

基數(shù)排序排序(英語:Radix sort)是一種非比較型整數(shù)排序算法,其原理是將整數(shù)按位數(shù)切割成不同的數(shù)字,然后按每個位數(shù)分別比較。

它是這樣實現(xiàn)的:將所有待比較數(shù)值(正整數(shù))統(tǒng)一為同樣的數(shù)位長度,數(shù)位較短的數(shù)前面補零。然后,從最低位開始,依次進行一次排序。這樣從最低位排序一直到最高位排序完成以后, 數(shù)列就變成一個有序序列。
基數(shù)排序的方式可以采用LSD(Least significant digital)或MSD(Most significant digital),LSD的排序方式由鍵值的最右邊開始,而MSD則相反,由鍵值的最左邊開始。

以下是一個測試用例:
代碼如下:#-*- coding:utf8 -*-
import random
def jichu(data, length):
    """
    基數(shù)排 lsd
    @param data: 需要排列的組合
    @param length: 最大的數(shù)據(jù)是幾位

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 牙克石市| 绍兴市| 化隆| 翼城县| 张家界市| 永顺县| 平武县| 丰原市| 健康| 闽侯县| 清新县| 田东县| 望城县| 南靖县| 枣阳市| 无锡市| 墨脱县| 武平县| 涿州市| 永春县| 大同市| 健康| 姜堰市| 博客| 洛浦县| 迁安市| 额尔古纳市| 安宁市| 荆门市| 九台市| 永清县| 朔州市| 越西县| 华池县| 长泰县| 博罗县| 谢通门县| 碌曲县| 忻州市| 托克逊县| 南平市|