如何基於App SDK快速地開發一個IoT App?
阿新 • • 發佈:2020-11-25
基數排序
基本概述
基數排序是一種非比較型整數排序演算法,其原理是將整數按位數切割成不同的數字,然後按每個位數分別比較。由於整數也可以表達字串(比如名字或日期)和特定格式的浮點數,所以基數排序也不是隻能使用於整數。
排序思路
基數排序是有兩種選擇,一種是高位優先法(MSD)(Most Significant Digit first),一種是低位優先法(LSD)(Least Significant Digit first),後者是先按個位數大小進行排序,再依次向高位排序,我們這裡採用後者。
java程式碼
public void radixSort(int[] target){ //建立快取陣列,用於暫存每趟排序後的陣列 int[] buf = new int[target.length]; //用於迴圈進位,這裡用long是為了防止陣列中的數字位數過多,導致越界問題 long exp = 1; int max = Arrays.stream(target).max().getAsInt(); //獲取陣列中最大值 while(exp<=max){ //用於統計每一輪該位數上數值為0-9的元素的個數 int[] tmp = new int[10]; for(int i=0;i<target.length;i++){ tmp[(target[i] / (int)exp) % 10]++; } //為了定位每輪排序之後各元素在陣列中的位置範圍 for(int i=1;i<10;i++){ tmp[i] += tmp[i-1]; } //暫存每趟排序後的陣列 for(int i=buf.length-1;i>=0;i--){ int x = (target[i] / (int)exp) % 10; buf[tmp[x]-1] = target[i]; tmp[x]--; } System.arraycopy(buf,0,target,0,target.length); exp *= 10; }
複雜度分析
· 時間複雜度:O(r*N),其中r是陣列中最大數字的位數,N為陣列的長度,由於r為一個常量,故歸為O(N)。
· 空間複雜度:O(N),其中N為陣列的長度。