5 內部排序 基數排序

2021-06-29 13:36:04 字數 2252 閱讀 7329

計數排序

前面所講的排序都

是基於比較的排序,都可稱為」比較排序「,其下界為o(nlogn)。那麼有沒有時間複雜度為o(n)的線性時間排序演算法呢?計數排序便是很基礎的一種線性時間排序,它

是基數排序的基礎

基本思想是:對每乙個元素x,確定小於x的元素個數,就可以把x直接放到它在有序序列中的位置上。具體說來即:假設待排序序列a中值的範圍[0,k],其中k表示待排序序列中的最大值。首先用乙個輔助陣列count記錄各個值在a中出現的次數,比如count[i]表示數值i在a中的個數。然後依次改變count中元素值,使count[i]表示a中不大於i的元素個數。然後從後往前掃瞄a陣列,a中的元素根據count中的資訊直接複製給a。

/*

* 計數排序後的順序為從小到大

* arr[0,...,len-1]為待排陣列,每個元素均是0-k中的乙個值

* crr[0,...,k]儲存0,...,k中每個值在陣列arr中出現的次數

*/public static int countsort(int arr, int k)

} return arr;

}

最後我們稍微總結下計數排序的特點:

1、不是基於比較的排序,因此可以達到線性排序時間;

2、採取空間換時間的思想,需要brr和crr等輔助空間,但是時間複雜度僅為o(n+k);

3、穩定性好,這也是計數排序最重要的乙個特性。

在實際工作中,當k=o(n)時,我們一般才會採取計數排序,如果k很大,則不宜採取該演算法,尤其在如下情形下:待排序元素為:1、3、8、5、10000000,這樣會造成很大的資源浪費。

基數排序

在計數排序中,當k很大時,時間和空間的開銷都會增大(可以想一下對序列用計數排序,此時不但浪費很多空間,而且時間方面還不如比較排序)。基數排序的基本思想就是把待排序記錄分解成個位(第一位)、十位(第二位)....然後分別以第一位、第二位...對整個序列進行計數排序。這樣的話分解出來的每一位不超過9,即用計數排序序列中最大值是9.

實現過程如下圖所示:

每一步都需要對各個位上的數進行排序,為了保證基數排序的穩定性,我們對每個位上的數進行排序時可以選用計數排序。

實現**

public class radixsort 

// 再將brr中的元素複製給arr,這樣arr就有序了

for (i = 0; i < len; i++)

} /*

* 基數排序後的順序為從小到大 其中引數d為元素的位數

*/public static void radixsort(int arr, int brr, int w, int crr,

int len, int k, int d)

} public static void main(string args) ;

int brr = new int[6]; // 用來儲存每次計數排序後的結果

int w = new int[6]; // 每次迴圈時,儲存該位上的數

int crr = new int[8]; // 每次迴圈時,儲存該位上的數出現的次數

radixsort(arr, brr, w, crr, 6, 7, 3);

for (i = 0; i < 6; i++)

system.out.print(arr[i] +" ");

}}

最後我們同樣對基數排序稍微做下總結

1、同樣不是基於比較的排序,因此可以達到線性排序時間;

2、同樣採取空間換時間的思想,需要額外的輔助空間,但是時間複雜度僅為o(d(n+k));

3、基數排序的穩定性同樣也很好。

時間複雜度:o(d(n+k)),對n個記錄(假設記錄含有d個關鍵字,每個關鍵字有k個取值)基數排序。每一趟分配的時間複雜度是o(n),每一趟收集的時間複雜度是o(k),總共需要d趟分配和收集。

空間複雜度

:o(k * n)(鏈式基數排序中空間複雜度不同)

另附:計數排序、基數排序、桶排序的另一篇博文,來自博主:蘭亭風雨

內部排序(五)基數排序

基數排序是一種借助多關鍵字排序的思想對單邏輯關鍵字進行排序的方法。實現的過程不需要之前的所有排序所需要的記錄關鍵字比較,移動等操作。多關鍵字排序 多關鍵字排序通常有兩種方法 1 msd most significant digit 法,最高為優先法 2 lsd least significant d...

演算法(5)基數排序

基數排序,有點像我們平時比較數字的大小,不同的是我們比較數字大小是從最高位開始看,而基數排序則是從最低位進行比較。基數排序的演算法是這樣是實現的 先確定陣列內元素的最大位數。由這個位數可以確定外面大迴圈的次數。按最低位,進行排序。這裡使用的是上一節的計數排序 隨後依次,直到最高位也排序完。如下 並且...

排序 基數排序

基數排序 radix sort 是屬於 分配式排序 distribution sort 基數排序法又稱 桶子法 bucket sort 或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些 桶 中,藉以達到排序的作用。排序思想 首先按照資料的最低位 個位 將資料分配到0 9...