演算法分析 計數排序(一種有趣的排序方法)

2021-09-10 04:47:51 字數 1374 閱讀 4285

以前自己的部落格總是零零散散,學習的東西也有記錄,但是沒有歸納到一塊兒,後來也就慢慢丟了。所以打算定期花點時間,把學習的東西整理一下,以便日後查閱。

計數排序是一種有趣又扯淡的排序方法。

我們有已知陣列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...