1. 程式人生 > >Java計數排序原理

Java計數排序原理

java計數排序實現的條件

  1. 給定的資料是整數型別
  2. 給定資料值的本身大小有一定的限制(值不能太大)

例如: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]);
        }
    }
}