我們常用的排序演算法,有冒泡演算法、快速演算法等,它們都是基於元素之間的比較來進行排序,有一種特殊的演算法不是基於元素比較,而是利用陣列下標來確定元素在陣列的位置,這種演算法就是「計數排序」。
先來說一下實現的原理,假設有20個隨機整數的陣列array,他們值分別是:9,3,5,4,9,1,2,7,8,1,3,6,5,3,4,0,10,9,7,9.有沒有發現這些整數的大小都是在[0,10]區間內,這時我們可以定義乙個長度為11的陣列countarray,每個元素的初始值都為0.當我遍歷這20個隨機整數時,每個值在countarray的下標位置對號入座。
注意:不是賦值,而是每有乙個值,就在對應位置+1,譬如遍歷array的第一位元素9,就會在array[9]位置+1,遍歷array的第二位元素3時,就在countarray[3]位置+1,如此類推。
最終遍歷整個array陣列後,countarray陣列變成以下情況:
value:12
1322
1214
1index:01
2345
6789
10每乙個value值對應表示下標值出現的次數,有了這個統計結果,那麼重新排序就顯得簡單粗暴。
直接依次輸出排序後的陣列結果:0,1,1,2,3,3,3,4,4,5,5,6,7,7,8,9,9,9,9,10
下面是**實現:
public int countsort(int array)
}//根據陣列的最大值確定統計陣列的長度
int countarray = new int[max+1];
//遍歷array,填充countarray
for(int i=0; i好了,**已經給出來了,必須注意一點是上面**有不少侷限性,首先獲取array陣列的最大值+1作為countarray陣列的長度,不嚴謹,其次,這是在陣列元素值為[0,10]區間的整數才可以。
下面給出改進栗子:
原始無序陣列array:
value
9594
9198
9990
9993
9192
index01
2345
6789
對於統計陣列countarray,我們採用array陣列的(最大值-最小值+1)作為countarray的長度,即(99-90+1)=10,用array陣列的最小值90作為countarray陣列的偏移量,譬如95,則(95-90)=5,會在countarray[5]的值加1,對於純碎的整數排序,只要在上面**稍微修改一下就ok了,但是對於現實業務排序,就顯得很雞肋,譬如學生的成績排序,
姓名成績
sam90
tom99
jack
95jane
94kan
95按照原來的統計思路,可以得到下面的統計陣列:
value10
0012
0001
index01
2345
6789
這種情況下,如果成績相同,應當按照固有順序排序,但是,怎麼確定原來的固有順序對應的人呢?現在就要對統計陣列進行變變形,統計陣列從第二個元素開始,每個元素的值都加上前面所有元素的值的和。
value11
1124
4445
index01
2345
6789
為什麼要相加呢?目的是儲存當前元素值的最後位置,譬如下標為9的元素,不管有多少個值為99的元素,反正該值的元素最後乙個位置是5.
倒序遍歷array陣列,第乙個被遍歷的元素kan的95,找到countarray陣列下標為5的value值,是4,代表kan是在輸出陣列sortarray中排的位置是第四位(即,是輸出陣列sortarray[3]的值,注意,這個下標值可以通過countarray對應的元素值減1得到,countarray對應的元素值又可以通過countarray[array[i]-min]得到),然後countarray陣列下標為5的value值相應減去1,4—>3,依次遍歷,過程中再遇到95,那麼該95排的位置是第三位,如此類推。這樣一來,就可以清楚的將同樣是95分的jack和kan排出順序來,這就是穩定排序。
**實現:
public int countsort(int array)
if(array[i]=0; i--)
return sortarray;
}
至此,計數排序和穩定排序結束,穩定排序就是在計數排序的基礎上進化的,另外還要注意它們的侷限性,原始陣列元素的值必須都是整數,還有當陣列的最大值與最小值差距較大時,使用計數排序顯得沒有意義了,因為計數排序是以犧牲空間複雜度來換取時間複雜度的演算法。 排序演算法 最穩定的計數排序
有沒有一種排序演算法的時間複雜度為o n 呢?如果面試官這麼問你,千萬不要直接否定!事實上是有線性時間複雜度的排序演算法,只不過其使用條件有限,只能是滿足條件的整數 0 n 序列,而且需要一定的輔助空間。這就是我們即將要提到的 計數排序。對於排序演算法來說計數排序是穩定的,跟桶排序相比其所占用的空間...
計數排序 python 穩定版排序
from future import print function defcounting sort collection 計數排序 演算法思想 假設要排序的陣列為 a 這裡最大值為3,最小值為0,那麼我們建立乙個陣列c,長度為3 1 0 4。然後一趟掃瞄陣列a,得到a中各個元素的總數,並保持到陣列...
穩定版計數排序
相比樸素版計數排序,可以保證排序後陣列中相等元素原本的先後順序不變。class solution 2.建立統計陣列並統計對應元素個數 int m maxval minval 1 vector int temp m for int i 0 i 3.統計陣列做變形,後面的元素等於前面的元素之和 int ...