1.[**][python]**
# -*- coding: utf-8 -*-
def _counting_sort(a, b, k):
"""計數排序,偽碼如下:
counting-sort(a, b, k)
1 for i ← 0 to k // 初始化儲存區的值
2 do c[i] ← 0
3 for j ← 1 to length[a] // 為各值計數
4 do c[a[j]] ← c[a[j]] + 1
5 ▷ c[i]包含等於i的元素個數
6 for i ← 1 to k // 求計數和,確定<=各值的元素數
7 do c[i] ← c[i] + c[i-1]
8 ▷ c[i]包含小於或等於i的元素個數
9 for j ← length[a] downto 1
10 do b[c[a[j]]] ← a[j] // 將a[j]值放到對應位置
11 c[a[j]] ← c[a[j]] - 1 // 避免元素相同時覆蓋同一位置
t(n) = θ(n)
args:
a (sequence): 原陣列
b (sequence): 結果陣列
k (int): 值上限,假定了所有元素介於[0,k]
len_c = k + 1
c = [0] * len_c
for a in a:
c[a] = c[a] + 1
for i in range(1, len_c):
c[i] = c[i] + c[i-1]
for a in a[::-1]:
b[c[a]-1] = a
c[a] = c[a] - 1
def counting_sort(a):
"""假定a陣列所有元素都介於[0,len(a)-1]"""
b = [0] * len(a)
_counting_sort(a, b, len(a) - 1)
return b
if __name__ == '__main__':
import random, timeit
items = range(10000)
random.shuffle(items)
def test_sorted():
print(items)
sorted_items = sorted(items)
print(sorted_items)
def test_counting_sort():
print(items)
sorted_items = counting_sort(items)
print(sorted_items)
test_methods = [test_sorted, test_counting_sort]
for test in test_methods:
name = test.__name__ # test.func_name
t = timeit.timer(name + '()', 'from __main__ import ' + name)
print(name + ' takes time : %f' % t.timeit(1))
計數排序(python)
計數排序是乙個非基於比較的排序演算法。它的優勢在於在對一定範圍內的整數排序時,它的複雜度為 n k 其中k是整數的範圍 當o k o nlogn 時快於任何比較排序演算法。這是一種犧牲空間換取時間的做法,而且當o k o nlog n 的時候其效率反而不如基於比較的排序 基於比較的排序的時間複雜度在...
python計數排序
對每個元素確定小於該元素的個數 def countsort a,k k是元素數值上界 c 0 k result 0 len a for i in range len a c a i c a i 1 計算小於該元素的個數 for i in range k 1 c i 1 c i 1 c i 每個減輕去...
計數排序 python
以下以 1,3,5,8,2,5,4 這組數字來演示。首先,我們找到這組數字中最大的數,也就是 bucketlen 8,建立乙個最大下標為 8 的空陣列 bucket 遍歷資料,將資料的出現次數填入bucket中對應的下標位置中。遍歷 bucket 將資料依次取出即可。def countingsort...