基數排序(radix sort)屬於"分配式排序"(distribution sort),又稱"桶子法"(bucket sort)或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些"桶"中,藉以達到排序的作用,基數排序法是屬於穩定性的排序,其時間複雜度為o (nlog(r)m),其中r為所採取的基數,而m為堆數,在某些時候,基數排序法的效率高於其它的穩定性排序法。從上面的簡單介紹,是並不了解基數排序是怎麼弄的~基數排序不同與其他的7種排序,其他7種排序本質上都是按照交換或者比較來進行排序,但是基數排序並不是,它是按照分配,**(分配到不同的位置上,然後**)..不斷分配..**來進行排序,直到有序..
聽上去好像很高大上,很難的樣子,其實不然。基數排序挺簡單的,下面我就來看一下基數排序的流程....
我們有9個桶,將陣列的數字按照數值分配桶中:
ps:**於網路,侵刪
上面我們發現:如果將桶按順序進行**,那麼我們的排序就完成了~
可是,一般我們的陣列元素都不僅僅是個位數的數字的呀,那麼高位數的數字又怎麼弄呢??比如:23,44,511,6234這些高位數..
其實也是一樣的:
ps:**於網路,侵刪
機智的同學可能就會發現了,關於這個桶我們可以用二維陣列來進行存放。
10個桶子就是10列,如果分配時有的數字相同的話,那麼就弄成多行~
首先我們有以下這個陣列:
int arrays = ;
現在我們有10個桶子,每個桶子下能裝載arrays.length
個數字..
int buckets = new int[arrays.length][10];
效果如下:01
2345
6789
將陣列的每個個位數進行分配到不同的桶子上:01
2345
6789
64322
432344
55分配完之後,我們按照順序來進行**:得到的結果應該是這樣子的:
將陣列的每個十位數進行分配到不同的桶子上(像6這樣的數,往前邊補0):
於是我們可以得到這樣的排序:01
2345
6789
64322
432344
55分配完之後,我們按照順序來進行**:得到的結果應該是這樣子的:
將陣列的每個百位數進行分配到不同的桶子上(像6、55這樣的數,往前邊補0):
於是我們可以得到這樣的排序:01
2345
6789
6554322
432344
分配完之後,我們按照順序來進行**:得到的結果應該是這樣子的:
將陣列的每個百位數進行分配到不同的桶子上(像6、55,344,432這樣的數,往前邊補0):
於是我們可以得到這樣的排序:01
2345
6789
655344432
4322
分配完之後,我們按照順序來進行**:得到的結果應該是這樣子的:
此時我們的陣列就已經可以排好序了~~~過程就是這樣子,其實不難就只有兩個步驟:
我們的基數排序是按照個、十、百、千位...來進行存放的。前面的演示是已經知道陣列元素的資料的情況下來進行存放,但是一般我們是不去理會陣列內元素的值的。那如果位數很多(萬位)或者都是個位數,這個條件我們怎麼去處理呢?
我們可以這樣做:先求出陣列最大的值,然後不斷/10,只要它能大於0,那麼它的位數還有~:
這個我在前面寫遞迴的時候就有這個**了,我就直接搬去遞迴的**過來了,順便複習一哈吧:
/**
* 遞迴,找出陣列最大的值
* @param arrays 陣列
* @param l 左邊界,第乙個數
* @param r 右邊界,陣列的長度
* @return
*/public static int findmax(int arrays, int l, int r) else else
}
public static void radixsort(int arrays)
//**桶子裡的元素
int k = 0;
//有10個桶子
for (int j = 0; j < 10; j++) }}
}}
搞了一堆數測試了一哈:
基數排序(桶排序)要理解起來並不困難,不過值得注意的是:基數排序對有負數和0的數列難以進行排序
基數排序的要點就兩個:
基數排序就這麼簡單
基數排序 radix sort 屬於 分配式排序 distribution sort 又稱 桶子法 bucket sort 或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些 桶 中,藉以達到排序的作用,基數排序法是屬於穩定性的排序,其時間複雜度為o nlog r m 其...
基數排序就這麼簡單
基數排序 radix sort 屬於 分配式排序 distribution sort 又稱 桶子法 bucket sort 或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些 桶 中,藉以達到排序的作用,基數排序法是屬於穩定性的排序,其時間複雜度為o nlog r m 其...
氣泡排序就這麼簡單
在我大一的時候自學c語言和資料結構,我當時就接觸到了氣泡排序 當時使用的是c語言編寫的 現在大三了,想要在暑假找到乙份實習的工作,又要回顧一下資料結構與演算法的知識點了。排序對我們來說是一點也不陌生了,當你打王者榮耀的時候也會有段位之分,當你打dota的時候也有天梯分。從高往下數,這個排名是有規律的...