非基於比較的排序與樣本的資料狀況有很大的關係,由於這個限制使其在工程中並不常用。
非基於比較的排序有桶排序,基數排序,計數排序。這三者都能做到排序的穩定性,時間複雜度為 o(n),空間複雜度為 o(n)。
假設存在一組資料,裡面的資料只有 0 ~ 60 ,使用非基於比較的排序。
思路:此時可以使用計數排序,準備 61 個桶並編號 0 ~ 60 (具體實現可以是乙個長度為 61 的陣列,也可以是其他的資料結構,桶只是乙個抽象的概念),然後將資料遍歷,按照數值放入對應編號的桶中。
按次序遍歷桶,如果 0 號桶存放的數字為5,則列印 5 個 0 ,最終就可以得到乙個排序的數列。
public
static
void
bucketsort
(int
arr)
//int bucket = new int[max + 1];
for(
int i =
0; i < arr.length; i++
)int arr_index =0;
for(
int j =
0; j < bucket.length; j++)}
}
如果此時資料範圍變得較大,如 0 ~ 1,000,000,000 ,則不宜使用計數排序,應該使用基數排序。基數排序只準備 10 個桶,分別編號 0 ~ 9,從個位開始,按照個位數的值進入桶,按照桶編號從小到大倒出數。迴圈,依次比較十位、百位、千位···
給定乙個陣列,求如果排序之後,相鄰兩數的最大差值,要求時間複雜度 o(n),且要求不能用非基於比較的排序。
這個問題是要求不能用非基於比較的排序,那如果用非基於比較的排序如何做?
思路如下:
對於 n 個數,準備 n + 1 個桶,目的是預留乙個空桶,此後有大作用。
遍歷陣列,找到陣列的最大值 max 和最小值 min,如果 max == min,返回 0;否則,按照桶排序的規則劃分成 n + 1 個資料範圍。
此時 n + 1 個桶裝 n 個數,一定會存在乙個空桶,這時候有乙個推論,相鄰兩個數的最大差值一定不來自同乙個桶。
桶需要記錄三個引數,桶是否存過數 boolean,桶中數字最大值和最小值。
所以在將乙個個數填入桶時,及時更新桶中數字最大值和最小值。
最後遍歷桶,在遍歷過程中記錄乙個全域性變數最大差值。遇到非空桶則取出此桶的最小值和上乙個非空桶的最大值,此時如果差值比全域性變數大,則更新全域性變數。
問題:為什麼不求空桶兩側?
空桶兩側的資料不一定是最大差值,因為乙個桶的範圍如果是 d,則空桶兩側的數值差最小可為 d + 2,而相鄰的非空桶最大差值可為 2d - 2。不能保證 d + 2 必定大於 2d - 2。預留乙個桶的設計目的是為了推出最大差值是來自不同桶的結論,而不能推出來自空桶兩側的結論。
實現:
public
static
intmaxgroup
(int
arr)
if(max == min)
return0;
//建立桶中三個儲存的資訊
boolean
hasnum =
newboolean
[len +1]
;int
maxnum =
newint
[len +1]
;int
minnum =
newint
[len +1]
;//遍歷更新桶中的資訊
for(
int i =
0; i < len; i++
)//遍歷得到相鄰兩個數的最大差值
int res =0;
int lastmax = maxnum[0]
;//注意此處的 i 從 1 開始,遍歷的是桶,桶長度是 len + 1
for(
int i =
1; i <= len; i++)}
return res;
}public
static
intbucket
(int number,
int min,
int max,
int length)
非基於比較的排序 桶排序
我們最常用的快速排序和堆排序等演算法需要對序列中的資料進行比較,因為被稱為基於比較的排序。而非基於比較的排序有計數排序,桶排序,和在此基礎上的基數排序。要注意的是,非基於比較的排序演算法的使用都是有條件限制的,例如元素的大小限制。假設待排序資料是乙個隨機過程產生,該過程將元素一致地分布在某區間上。桶...
非基於比較的排序演算法例題
題目 給定乙個陣列,求如果排序之後,相鄰兩數的最大差值,要求時間複雜度o n 且要求不能用非基於比較的排序。例 3,1,6,2,7 排序後得到 1,2,3,6,7 並且相鄰兩數的最大差值是3 元素3和元素6的差值 解決思路 利用到桶的思想,陣列有n個數,定義n 1個桶,遍歷陣列找到最小值和最大值,放...
非基於比較的排序演算法之一 計數排序
計數排序 counting sort 是一種穩定的排序演算法。計數排序使用乙個額外的陣列c,其中第i個元素是待排序陣列a中值小於等於i的元素的個數。然後根據陣列c來將a中的元素排到正確的位置。限制 所有值得取值範圍不能太大,並且需要知道確切的取值範圍。本演算法需要的輔助空間要求較高。當輸入的元素是 ...