Hark的数据结构与算法练习之基数排序
算法說明
基數排序是基于計數排序的,所以看這個之前要先看一下計數排序對于理解基數排序是很有幫助的(發現計數和基數的音節幾乎一致啊)。這個我有寫,請點擊。
OK,現在你肯定已經熟悉了計數排序,那么我就來說一下基數排序。
所謂基數排序,其實就是分別對數字的個位,十位,百位,百位。。。。分別進行計數排序。
當然可以從個位往上進行計數排序,也可以從高位往個數計數排序,這里我們使用個位往上計數排序的方法。
?
話說,我想了好半天,不知道從哪里入手說基排(雞排,哈哈)的思路……好蛋疼
這樣,先從與計數排序的區別說起吧,區別在于計數排序是直接對數字進行排序。而基數排序是分別對個位,十位,百位。。。進行排序的。
然后,每個位數中,都有0至9共10個數字(即個數時,其實就是10個數字做排序;十數時,其實也是對10個數字做排序),接著我們對每個數字中的數字進行計數排序(好繞口,意思就是說,當進行個數排序時,個位為1時,所以個位為1的數字進行計排,例如11,21,31,221,411等等)。
所以我們申請的是二維數組int[][] radixBucket = new int[10][length]; (代碼27行) ?第一維的10存儲的就是我們每次都是對10個數分別進行計排。第二維存儲的就是對應的要排序的數字啦 ?
?
同時,因為我們要保證數字的穩定性,當我們把低位的數字進行計排后,要把低位數字輸出至原始數組中,然后再進行高位排序。
OK,解釋到現在不知道有沒有說清楚了。。。我發現我語言表達能力還真的是很差勁啊。
?
我覺得看代碼可能會更清楚些,代碼上也有注釋,代碼如下:
?
?
代碼
使用的是java
/** 基數排序*/ public class RadixSort {public static void main(String[] args) {int[] arrayData = { 2, 3, 1, 5, 6, 7, 4, 65, 42 };RadixSortMethod(arrayData, 100);for (int integer : arrayData) {System.out.print(integer);System.out.print(" ");}}/** arrayData - 要排序的數據 height - 要排序的步長 如果100,則只排序個位十位*/public static void RadixSortMethod(int[] arrayData, int height) {int maxNum = 0; // 最大值,用于存儲桶數據臨時數組空間大小for (int data : arrayData) {if (data > maxNum) {maxNum = data;}}int step = 1;int length = arrayData.length;int[][] radixBucket = new int[10][length]; // 二維數組,排序的容器int[] arrayTemp = new int[maxNum + 1]; // 這個是每個桶中的數字個數int num;int index = 0;while (step < height) {for (int data : arrayData) {// 當step=1時統計個數,這時取出個位的數字。// 當step=10時,統計十數,這時取出十位的數字num = data / step % 10;radixBucket[num][arrayTemp[num]] = data;arrayTemp[num]++;}for (int i = 0; i < 10; i++) {if (arrayTemp.length > i && arrayTemp[i] != 0) {for (int j = 0; j < arrayTemp[i]; j++) {arrayData[index] = radixBucket[i][j];index++;}arrayTemp[i] = 0; // 將當前數字個數重置為0,用于下次的統計}}step *= 10;index = 0;}} }
結果
1 2 3 4 5 6 7 42 65?
時間復雜度:
假設步長是s,待排序數組長度是n,數字最大值是m
那么時間復雜度就是O(s(n+(10*m)))=O(s(m+n))
?
空間復雜度:
待排序數組長度是n,數字最大值是m。
那么空間復雜度就是O(10*n+(m+1))=O(m+n)
?
穩定性:是穩定的
?
應用場景:
針對最大值相對比較小的正整數。
?
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Hark的数据结构与算法练习之基数排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java_io体系之RandomAcce
- 下一篇: 使用jQuery卸载绑定的事件