我的计数排序算法中的编程问题

时间:2016-02-23 05:11:11

标签: java algorithm sorting

请让我知道我在这个简短的代码中遇到的问题。我试图从书中跟踪算法并将其转换为程序但在此过程中做了一些错误。它抛出arrayoutofbounds异常

Algo which i tried to follow is bellow:

countingsort(a,b,k)
    1)let c[0..k] be a new array
    2)for i =0 to k
    3)   c[i]=0;
    4)for j=1 to a.length
    5)  c[a[j]]=c[a[j]]+1
    6)for i = i to k
         c[i] = c[i] + c[i-1]
    7)for j=a.length downto 1
         b[c[a[j]]]= a[j]
         c[a[j]] = c[a[j]]-1

public class CountingSort {
    public static void main(String[] args) {
        int[] array_A = {6, 0, 2, 0, 1, 3, 4, 6, 1, 3, 2};
        int[] array_B = new int[array_A.length];

        int k = 6;
        countingSort(array_A,array_B,k);
        //System.out.println(array_B);


    }
    public static void countingSort(int[] A, int[] B, int k){
        int[] C = new int[k+1];
        for(int i = 0; i<=k; i++){
            C[i] = 0;
        }
        for(int j = 0; j<A.length; j++){
            C[A[j]] = C[A[j]] + 1;

        }
        for(int i = 1; i<=k; i++){
            C[i] = C[i] + C[i-1];
        }
        for(int j = A.length-1; j>=1; j--){
            B[C[A[j]]] = A[j];
            C[A[j]] = C[A[j]] - 1;
        }

        System.out.println(Arrays.toString(B));


    }

}

Error:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11
    at importantPrograms.CountingSort.countingSort(CountingSort.java:22)
    at importantPrograms.CountingSort.main(CountingSort.java:11)

3 个答案:

答案 0 :(得分:0)

更改

  1. C[A[j]] = C[A[j] + 1];C[A[j]] = C[A[j]] + 1;,因为您应该计算特定号码的出现次数。

答案 1 :(得分:0)

以下是修改后的代码,对我有用。

import java.util.Arrays;
public class CountingSort {
    public static void main(String[] args) {
        int[] array_A = {6, 0, 2, 0, 1, 3, 4, 6, 1, 3, 2};
        int[] array_B = new int[array_A.length];
        int k = 6;
        countingSort(array_A,array_B,k);
        System.out.println(Arrays.toString(array_B));
    }
    public static void countingSort(int[] A, int[] B, int k){
        int[] C = new int[k+1];
        for(int i = 0; i<=k; i++){
            C[i] = 0;
        }
        for(int j = 0; j<A.length; j++){
            C[A[j]] ++;
        }
        for(int i = 1; i<=k; i++){
            C[i] += C[i-1];
        }
        for(int j = A.length-1; j>=0; j--){
            B[--C[A[j]]] = A[j];
        }
    }
}

理想情况下,不是硬编码最大值(6),而是以编程方式找到最大值并相应地调整计数数组的大小。如

主要方法

countingSort(array_A,array_B,max(array_A));

最大方法

public int max(int[] arr){
    int m = 0;
    for(int i : arr){
        if(i>m){
            m = i;
        }
    }
    return m;
}

答案 2 :(得分:0)

我不知道你在做什么,但你的第二个for循环只有一点点错误。 更改j<A.length to j<C.length