計數排序與穩定排序

2021-08-28 23:22:41 字數 2298 閱讀 2790

我們常用的排序演算法,有冒泡演算法、快速演算法等,它們都是基於元素之間的比較來進行排序,有一種特殊的演算法不是基於元素比較,而是利用陣列下標來確定元素在陣列的位置,這種演算法就是「計數排序」。

先來說一下實現的原理,假設有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 ...