1. 程式人生 > >排序演算法總結及面試題

排序演算法總結及面試題

    // d為資料長度
    private static void radixSorting(int[] arr, int d) {  
        for (int i = 1; i <=d; i++) {
            int[] res = countingSort(arr, i); // 依次對各位數字排序(直接用計數排序的變體)
            for(int j=0;j<arr.length;j++){
                arr[j]=res[j];
            } 
        } 
    } 
    // 利用計數排序對元素的每一位進行排序
    private static int[] countingSort(int[] arr, int expIndex) {
        int k = 9;
        int[] b = new int[arr.length];
        int[] c = new int[k + 1]; // 這裡比較特殊:數的每一位最大數為9
        for (int i = 0; i < k; i++) {
            c[i] = 0;
        }
        for (int i = 0; i < arr.length; i++) {
            int d = getBitData(arr[i], expIndex);
            c[d]++;
        }
        for (int i = 1; i <= k; i++) {
            c[i] += c[i - 1];
        }
        for (int i = arr.length - 1; i >= 0; i--) {
            int d = getBitData(arr[i], expIndex);
            b[c[d] - 1] = arr[i];// C[d]-1 就代表小於等於元素d的元素個數,就是d在B的位置
            c[d]--;
        }
        return b;
    }
    // 獲取data指定位的數
    private static int getBitData(int data, int expIndex) {
        while (data != 0 && expIndex > 0) {
            data /= 10;
            expIndex--;
        }
        return data % 10;
    }

	public static int[] countSort(int[] a){
	    int b[] = new int[a.length];
        int max = a[0],min = a[0];
        for(int i:a){
            if(i>max) max=i;
            if(i<min) min=i;
        }//這裡k的大小是要排序的陣列中,元素大小的極值差+1
        int k=max-min+1;
        int c[]=new int[k];
        for(int i=0;i<a.length;++i){
            c[a[i]-min]+=1;//優化過的地方,減小了陣列c的大小
        }
        for(int i=1;i<c.length;++i){
            c[i]=c[i]+c[i-1];
        }
        for(int i=a.length-1;i>=0;--i){
            b[--c[a[i]-min]]=a[i];//按存取的方式取出c的元素
        }
        return b;
	}