線性時間排序之基數排序和計數排序的應用

2021-09-05 08:53:25 字數 1174 閱讀 8361

假設n個輸入元素中的每乙個都是在0到k區間內的乙個整數,其中k為某個整數,當k=o(n)時,排序的執行時間為o(n);

計數排序的基本思想是:對每乙個輸入元素,確定小於x的元素個數為y和自身的個數z,那麼最後乙個x就應該在y+z上.

這種排序所需要o(n)的空間,但它是穩定的,且為o(n)

基數排序 是先按最低有效位進行排序,接著以次高有效位進行排序,重複這一過程,直到所有排好.

在實際應用中:對於乙個32位的整數,可以把每8個二進位制位看成一部分,也就是說把乙個32位的字看成4個8位的整數。

於是每一輪排序花費o(n+k);

這樣就可以用計數排序 對非負整數陣列進行排序。但是對於包含了負數的陣列,必須設定相應的陣列索引和8位數字的對映關係,

這樣,就可以對負數進行計數,從而達到基數排序。

下面是**: 

/**

* 基數排序,只適用與非負數的排序

* @param nums

*/public void radixsort(int nums)

}/**

* 計數排序

* @param nums 未進行排序的

* @param ret 部分已經排好序的陣列

* @param base 哪乙個部分

*/protected void countsort(int nums, int ret, int base)

// 接下來, 將c[i]累計為i應該在排序好的陣列的位置

for (int i = 1;i < c.length;i++)

for (int i = nums.length-1;i >= 0;i--)

}protected int size(int n, int base)

/*// 如果陣列中存在負數, use it

protected int size(int n, int base)

// 最後一輪,base == 3時

// 如果n是正數, 是使用 [-128, 127] -> [0, 255]

if (n >= 0)

// 如果是負數, 去掉開頭的0, 比較餘後數的大小, 即可

return (n << 1) >>>25;

}*/

測試結果:

排序乙個63萬的隨機非負數陣列,僅僅需要12ms(本機)

線性時間排序之基數排序

標頭檔案 number.h pragma once include include include using namespace std class number include number.h number number int num number number void number nu...

線性時間排序 計數排序 基數排序 桶排序

之前總結的都是通過比較方法進行排序的演算法,我們知道,通過比較排序演算法平均時間複雜度最多為o lgn 這篇文章來分析一下非比較的線性時間排序方法,計數排序,基數排序,桶排序。正如它的名字,計數排序是通過計算待排序元素小於等於該元素的次數這個屬性,然後利用該屬性將元素以次數為下標挪入另外的陣列,不能...

計數排序和基數排序

計數排序和基數排序是屬於線性級時間複雜度的排序方式,雖然沒有冒泡,選擇,快排演算法那些讓人廣為所知,但是這兩種排序方式在某些場合非常適用。計數排序是基數排序的基礎,最為關鍵的是 基數排序演算法是字尾陣列的關鍵 當然字尾陣列也可以用快排 字尾陣列是用於處理字串的一種非常優秀的資料結構,可以高效的處理很...