不基於比較的排序(桶排序)和演算法的穩定性

2022-09-18 23:57:12 字數 1357 閱讀 4682

1、計數排序

2、基數排序

分析:1、桶排序思想下的排序都是不基於比較的排序

2、時間複雜度為o(n),額外空間負載度o(m)

3、應用範圍有限,需要樣本的資料狀況滿足桶的劃分

1、有十個桶,跟別代表進製位上的數字為多少

2、看看陣列中所有的數,最大的數的位數,作為迴圈的次數

3、找到相同進製位 位數為0-9的數字,分別入桶,再出桶,再找下乙個進製位,入桶,出桶

4、直到找到最後乙個進製位,入桶,出桶,就能排好序

public class radixsort

//排除了上面的情況,開始進行桶排序

radixsort(arr,0,arr.length-1,maxbits(arr));

}//此方法時進行桶排序,此時引數l是0,r是陣列長度,也可以進行自定義哪一段進行排序

private static void radixsort(int arr,int l, int r, int digit)

//累加,每個為上的數等於前面的相加,相當於桶排序中的入桶

for(i = 1;i= l; i--)

//將排好序的臨時陣列中的數重新賦值到陣列

for(i = l,j = 0; i<= r; i++,j++)}}

//此方法是獲取對應位置上的數值是多少

public static int getdigit(int x,int d)

大樣排程快排快,o(n*logn) 小樣插入快o(n^2)

對於array裡面的sort排序,在基數時候用快排,在不是基數的時候用歸併,原因在穩定性上,

因為基數的時候,穩定性沒用(相同的基數誰在前後無所謂),快排時間複雜度低

使用hashset hashmap

有序表的固定操作

1、void put(k key,v value):將乙個(key,value)記錄加入到表中,或者將key的記錄更新成value

2、v get(k key):根據給定的key,查詢value並返回

3、void remove(k key):移除key的記錄。

4、boolean containskey(k key):詢問是否有關於key的記錄

5、k firstkey():返回所有鍵值的排序結果中,最左(最小)的那個

6、k lastkey():返回所有鍵值的排序結果中,最右(最大)的那個

7、k floorkey(k key):如果表中存過key,返回key;否則返回所有鍵值的排序結果中,key的最後乙個

8、k ceilingkey(k key):如果表中存入過key,返回key;否則返回所有鍵值的排序結果中,key的最後乙個。

以上所有操作時間複雜度都是o(logn),n為有序表含有的記錄數

非基於比較的排序 桶排序

我們最常用的快速排序和堆排序等演算法需要對序列中的資料進行比較,因為被稱為基於比較的排序。而非基於比較的排序有計數排序,桶排序,和在此基礎上的基數排序。要注意的是,非基於比較的排序演算法的使用都是有條件限制的,例如元素的大小限制。假設待排序資料是乙個隨機過程產生,該過程將元素一致地分布在某區間上。桶...

基礎演算法 6 不基於比較的排序

o n 不基於比較的排序演算法 在接下來的幻燈片,我們將討論兩種不基於比較的排序演算法 計數排序和基數排序。這些排序演算法可以通過不比較陣列的專案來比時間複雜度為 n log n 的基於比較的排序演算法的下限更快。排序演算法的下限 我們都知道 在這個視覺化中也沒有證明,因為它需要花費乙個小時的講座來...

計數排序 不基於比較O n

計數排序,這種排序演算法不是基於元素比較,而是利用陣列下標來確定元素的正確位置。建立陣列a,按照待排序陣列的值b,根據每個b值對應a的下標 有了這個統計結果,排序就很簡單了,直接遍歷陣列,輸出陣列元素的下標值,元素的值是幾,就輸出幾次。它適用於一定範圍的整數排序。在取值範圍不是很大的情況下,它的效能...