以前自己的部落格總是零零散散,學習的東西也有記錄,但是沒有歸納到一塊兒,後來也就慢慢丟了。所以打算定期花點時間,把學習的東西整理一下,以便日後查閱。
計數排序是一種有趣又扯淡的排序方法。
我們有已知陣列a,需要將a中的元素排序(預設從小到大);
第一步:我們需要乙個輔助陣列b,b中任意元素有該特點:下標表示a中某元素的值,b中的值表示該元素在a**現得到次數。即b[i]=i在a**現的次數。
第二步:迴圈輸出b陣列,輸出規則為:當某元素a(下標為b)的值非零時,輸出a個b;
該排序方法其實利用了陣列下標的遞增性進行排序,但是這樣的方法有很大侷限性。首先,值需要表示為下標,則只能用於整數的排序,其次,如果a中的值稀疏且巨大,則b陣列的空間也會有很大浪費。如:a中數為1000000,則b陣列長度至少要超過該值。
首先是乙個簡易的生成指定個隨機數的演算法,檔案命名data.py:
import random
# 生成num位隨機數
defget_data
(num)
: arr =
for i in
range(0
, num):0
,99))
return arr
下面是用python完成的計數排序演算法:
import data
a = data.get_data(
1000
)def
counting_sort
(arr)
:# 確定最大值(用於確定陣列b的長度)
max=
-10000
for i in arr:
if i >
max:
max= i
# 生成最大值位的陣列b,元素值初始化為0
b =[0
]*(max+1
)# 用陣列b記錄元素在a**現的次數
for i in arr:
b[i]+=1
# 迴圈展開b
arr =
index =
0for i in b:
if i !=0:
p = i
while p >=0:
p -=
1 index +=
1return arr
print
(counting_sort(a)
)
該演算法我們可以看到主要的時間花費應該是在展開b陣列獲取排序後的值時,首先我們迴圈了b陣列的長度次,即最大值。然後在找到非零值時又進行了迴圈確定元素出現的次數,該迴圈總和為a的長度。
所以t(n) = o(n+k),n為元素個數,k為最大值。
一種快速排序演算法
using system class program for int l 0 l src.length l src count temp l i 3 0xff temp l static void main string args watch.stop console.writeline quick...
演算法分析之 計數排序
計數排序不同於比較排序,是基於計數的方式,對於計數排序,假設每乙個輸入都是介於0 k之間的整數。對於每乙個輸入元素x,確定出小於x的元素的個數。假如有17個元素小於x,則x就屬於第18個輸出位置。計數排序涉及到三個陣列a 0 length 1 length為陣列a的長度 陣列b與陣列a長度相等,存放...
快速排序演算法的一種實現
參考部落格 白話經典演算法系列之六 快速排序 快速搞定 功能 實現快速排序演算法 include 方法宣告 intadjustsort int a,int m,int n void quicksort int a,int m,int n int main void printf 排序前的陣列順序.n...