演算法學習 6

2021-07-26 09:01:33 字數 2058 閱讀 3578

計數排序是假設陣列a中的元素都是在0到k區間內的整數。構建乙個陣列c[0,..,k]初始化為-1,如果陣列a中的元素互異的話,那麼把a的元素拷貝到c中:c[a[i]] = a[i],然後遍歷c,把非-1的元素依次拷貝到陣列a中即可完成排序。但陣列有元素相等要怎麼處理了。

元素互異的做法,還可以是c[0,..,k]初始化為0,使c[a[i]] = 1,然後遍歷c如果c[i]等於1,就把下標i依次放到a中,這樣好像更好。如果有相同的元素,也就是會有c[a[i]] > 1,把下標i連續在a中放入c[a[i]]就行了。

偽**

counting-sort(a)

let c[0..k] be a new array

fori=0 to k

c[i] = 0

fori=1 to a.

length

c[a[i]] = c[a[i]] + 1

j = 1

fori=0 to k

while c[i] >= 1

a[j] = i

j = j + 1

c[i] = c[i] - 1

對於整數串排序很顯然可以得到正確的結果。

上述過程顯然只能存粹的排序乙個整數串,不能推廣到一般化,不能排序資料記錄或物件,當一組物件某個屬性可以用0到k的整數表示時,則我們可以基於這個屬性對物件排序,使用計數排序來排序陣列,上面的過程就是錯誤的。

這裡我們依然要假設a[i]表示元素,表示物件,同時a[i]表示某個屬性的值且是0到k區間的整數。

先定義乙個陣列b來存放輸出結果,b.length=a.length,當然也可以在陣列a上移動元素的位置來排序,但不適合計數排序方法。

思路是通過a[i]的值對應c[0,..,k]中的值來確定放在b[?]的位置,a[i]對應c的下標,如何確定c[a[i]]值,然後通過c[a[i]]的值來確定b[?]的下標?

顯然b[?]的下標就是c[a[i]]或者c[a[i]]的表示式。然是如果2個相同的a[i]值,就不好處理了。

可以猜想如果b是a排好序的陣列,那麼b的下標j就是表示小於陣列中元素小於等於b[j]的個數

那麼c[a[i]]的值如果==小於等於a[i]值的個數

則b[c[a[i]]] = a[i]就是把a[i]放到排好序對應的位置。

如何計數c[a[i]]

for i=1

to a.length

c[a[i]] = c[a[i]] + 1

//到這裡只是算出了c[a[i]]的值==等於a[i]值的個數

//把小於a[i]值的個數也加上

for j=1

to k

c[j] = c[j-1] + c[j]

計算b[c[a[i]]] = a[i]

for i=1 to a.length

b[c[a[i]]] = a[i]//如果i後面有相同的值會覆蓋之前的,c[a[i]]可以減去1來解決

c[a[i]] = c[a[i]] - 1

這裡有乙個問題就是相同的值a[i]和a[j],i

for i = a.length to 1

b[c[a[i]]] = a[i]

c[a[i]] = c[a[i]] - 1

顯然是的。

合併一下,完整**如下:

counting-sort(a,b,k)

let c[0..k] be a

new array

for i=0

to k

c[i] = 0

for i=1

to a.length

c[a[i]] = c[a[i]] + 1

//到這裡只是算出了c[a[i]]的值==等於a[i]值的個數

//把小於a[i]值的個數也加上

for j=1

to k

c[j] = c[j-1] + c[j]

for i = a.length downto 1

b[c[a[i]]] = a[i]

c[a[i]] = c[a[i]] - 1

演算法學習 python 6

氣泡排序 coding utf 8 def bubblesort list1 for j in range 0,len list1 1 增加乙個計數器 count 0 for i in range len list1 1 j,j,1 if list1 i list1 i 1 list1 i list...

演算法學習 Day6

實現乙個加法器,使其能夠輸出a b的值。輸入包括兩個數a和b,其中a和b的位數不超過1000位。可能有多組測試資料,對於每組資料,輸出a b的值。示例1 2 6 10000000000000000000 10000000000000000000000000000000 8 1000000000001...

演算法學習篇 6 整數排序

給一組整數,按照公升序排序,使用選擇排序,氣泡排序,插入排序或者任何 o n2 的排序演算法。氣泡排序 const sortintegers function a returna 選擇排序 const sortintegers function a 每迴圈一次交換一次值 var t a minind...