JAVA 計數排序,桶排序
阿新 • • 發佈:2018-10-31
排序演算法分為兩種:比較演算法、非比較演算法
其中比較排序是將要排序內容通過比較數值大小的方法,決定排列順序。為了降低時間複雜度引入分治,遞迴等方法。例如:選擇排序,插入排序,氣泡排序等基礎排序法。
非比較排序法是指通過統計每個數字的個數,或者位置的方法將待排序序列進行排序的演算法。其中計數演算法,桶排序演算法即為非比較演算法。
計數演算法:計數演算法的原理類似於Hash表的原理。建立一張資料表,在表中統計每個資料出現的次數
0 | 1 | 2 | 3 | 4 | 5 | 6 |
0(次) | 1(次) | 3(次) | 5(次) | 2(次) | 0(次) | 1(次) |
->[1,2,2,2,3,3,3,3,3,4,4,6] 排序結果顯而易見。程式碼如下:
返回結果:import java.util.ArrayList; import java.util.List; public class CountSort { public static List<Integer> countSort(int data[]){ //得到陣列的最大值與最小值,從而得到資料陣列的長度 int max = 0; int min = 0; for (int i = 0; i < data.length; i++) { max=data[i]>max?data[i]:max; min=data[i]<min?data[i]:min; } //資料陣列裝配 int[] temp=new int[max-min+1]; for (int i = 0; i < data.length; i++) { int aim=data[i]; temp[aim-min]=temp[aim-min]+1; } System.out.print("temp:"); for (int i = 0; i < temp.length; i++) { System.out.print(temp[i]); } //資料陣列到結果返回 List<Integer> result=new ArrayList<>(); for (int i = 0; i < temp.length; i++) { if(temp[i]!=0){ for (int j = 0; j < temp[i]; j++) { result.add(min+i); } } } return result; } public static void main(String[] args) { int a[]=new int[]{1,2,1,3,0,5,1}; List<Integer> list=countSort(a); System.out.println(); for (int i = 0; i < list.size(); i++) { System.out.print(list.get(i)); } } }
temp:131101
0111235
時間負責度為O(n),與基礎排序法相比明顯降低,但降低時間複雜度的代價是犧牲了空間。該方法使用在數字範圍不是很大的情況,否則會浪費大量空間。
桶排序:
桶排序是指根據待排序陣列內容建立若干個桶,每個桶代表一個數據範圍,當待排序陣列中的元素命中了其中某個桶時,將該元素放在桶中。當把所有的元素都放在桶中後,在各自的桶中內部進行排序操作。因為每個桶的範圍是數軸遞增的,將每個桶直接合並即可得到最後排序。程式碼:
public static void bucketSort(int[] arr){ int max = Integer.MIN_VALUE; int min = Integer.MAX_VALUE; for(int i = 0; i < arr.length; i++){ max = Math.max(max, arr[i]); min = Math.min(min, arr[i]); } //桶數 int bucketNum = (max - min) / arr.length + 1; ArrayList<ArrayList<Integer>> bucketArr = new ArrayList<>(bucketNum); for(int i = 0; i < bucketNum; i++){ bucketArr.add(new ArrayList<Integer>()); } //將每個元素放入桶 for(int i = 0; i < arr.length; i++){ int num = (arr[i] - min) / (arr.length); bucketArr.get(num).add(arr[i]); } //對每個桶進行排序 for(int i = 0; i < bucketArr.size(); i++){ Collections.sort(bucketArr.get(i)); } System.out.println(bucketArr.toString()); }