Java計數排序原理
阿新 • • 發佈:2018-11-10
java計數排序實現的條件
- 給定的資料是整數型別
- 給定資料值的本身大小有一定的限制(值不能太大)
例如:2、3、5、0、1、5、9、1、4、6
每個數都是整數且數的值大小為0-9之前,最大值為9
假如給定一個數組A,如下:
演算法實現過程:
1:上面陣列中最大的數為5,所以我們要構造一個大小為6的陣列。裡面存下所有對應A中每個元素之前的元素個數。
初始化一個大小為(k+1)的陣列C(所有元素初始值為0),遍歷整個待排序陣列A,將A中每個元素對應C中的元素大小+1。操作結果見下圖:
我們可以得到原陣列中有2個0,0個1,2個2,3個3,0個4,1個5.
2:.我們將C中每個i位置的元素大小改成C陣列前i項和。
3:現在要做的就是初始化一個和A同樣大小的陣列B用於儲存排序後陣列,然後倒序遍歷A中元素,通過查詢C陣列,將該元素放置到B中相應的位置,同時將C中對應的元素大小-1(表明已經放置了一個這樣大小的元素,下次再放同樣大小的元素,就要往前擠一個位置)。遍歷完A陣列後,就完成了所有的排序工作(只畫出了前3步):
最後的排序結果為:
java程式碼如下:
package sort; public class CountSort { private static int[] countSort(int[] array,int k) { int[] C=new int[k+1];//構造C陣列 int length=array.length,sum=0;//獲取A陣列大小用於構造B陣列 int[] B=new int[length];//構造B陣列 for(int i=0;i<length;i++) { C[array[i]]+=1;// 統計A中各元素個數,存入C陣列 } for(int i=0;i<k+1;i++)//修改C陣列 { sum+=C[i]; C[i]=sum; } for(int i=length-1;i>=0;i--)//遍歷A陣列,構造B陣列 { B[C[array[i]]-1]=array[i];//將A中該元素放到排序後陣列B中指定的位置 C[array[i]]--;//將C中該元素-1,方便存放下一個同樣大小的元素 } return B;//將排序好的陣列返回,完成排序 } public static void main(String[] args) { int[] A=new int[]{2,5,3,0,2,3,0,3}; int[] B=countSort(A, 5); for(int i=0;i<A.length;i++) { System.out.println((i+1)+"th:"+B[i]); } } }