【问题标题】:Counting Sort implementation计数排序实现
【发布时间】:2018-10-04 15:45:46
【问题描述】:

您好,我很难在 java 中实现计数排序方法。我相信问题来自我在方法中的最后两个循环。我收到了一个 ArrayIndexOutOfBounds 异常:8。我相信这来自我倒数第二个 for 循环,当索引 5 处的值为 8 但我不知道如何解决这个问题。任何帮助表示赞赏。谢谢!

在我的代码中,k 是输入数组中的最大值。

代码:

public static void main(String[] args) {
    int [] arrayOne = {0,1,1,3,4,5,3,0};
    int [] output = Arrays.copyOf(arrayOne, arrayOne.length);
    System.out.println(Arrays.toString(arrayOne));
    countingSort(arrayOne, output, 5);
    System.out.println(Arrays.toString(output));

}

public static void countingSort(int[] input, int[] output , int k){
    int [] temp = Arrays.copyOf(input, k+1);

    for (int i = 0; i <= k; i++){
        temp[i] = 0;
    }

    for (int j = 0; j <= input.length - 1; j++){
        temp[input[j]] = temp[input[j]] + 1;
    }

    for (int i = 1; i <= k; i++){
        temp[i] = temp[i] + temp[i-1];
    }

    for (int j = input.length; j >= 1; j--){
        output[temp[input[j]]] = input[j];
        temp[input[j]] = temp[input[j]] - 1;
    }
}

【问题讨论】:

  • 尝试将for (int i = 1; i &lt;= k; i++)更改为for (int i = 0; i &lt; k; i++)
  • for (int j = input.length; j >= 1; j--) 也可能需要改为 for (int j = input.length -1; j >= 1; j --)
  • 感谢您的回复!这并不能解决越界异常,我在最后一个 for 循环第二行中得到了这个异常。第一个 for 循环用于将 temp 数组中的每个值初始化为 0。
  • 请查看我更新的答案中的代码,它应该可以工作!

标签: java arrays indexoutofboundsexception counting-sort


【解决方案1】:

问题出在第一个循环中,因为数组 temp 长度为 6,而您在其中进行了 7 次交互。

所以在for 的末尾,它试图做temp[6]=0 并且你的数组的最后一个位置是temp[5]

要解决此问题,请将您的第一个循环更改为:

for (int i = 0; i < k; i++){

在最后一个循环中,您将得到相同的异常,因为 input[8] 不存在。

【讨论】:

  • 感谢您的回复!这并不能解决越界异常,我在最后一个 for 循环第二行中得到了这个异常。第一个 for 循环用于将 temp 数组中的每个值初始化为 0。该循环仅迭代 5 次,因为 k 的原始值为 5。
【解决方案2】:
import java.util.Arrays;

public class CountingSort {
    public static void main(String[] args) {
        int[] input = {0,1,1,3,4,5,3,0};
        int[] output = new int[input.length];
        int k = 5; // k is the largest number in the input array
        System.out.println("before sorting:");
        System.out.println(Arrays.toString(input)); 
        output = countingSort(input, output, k);
        System.out.println("after sorting:");
        System.out.println(Arrays.toString(output));
    }

    public static int[] countingSort(int[] input, int[] output, int k) {
        int counter[] = new int[k + 1]; 
        for (int i : input) { counter[i]++; } 
        int ndx = 0; 
        for (int i = 0; i < counter.length; i++) {
            while (0 < counter[i]) { 
                output[ndx++] = i;
                counter[i]--; 
            }
        }
        return output;
    }
}

以上代码改编自:http://www.java67.com/2017/06/counting-sort-in-java-example.html

【讨论】:

  • 答案不应依赖链接获取大部分内容。链接可能会失效,或者可以更改另一侧的内容以不再回答问题。请编辑您的答案以包含您链接到的信息。
  • 我已经编辑了我的答案,感谢您的建议@mypetition
【解决方案3】:

这可能会有所帮助,但请尝试使用 Arraya.sort() 方法。 例如:

//A Java program to sort an array of integers in ascending order.
// A sample Java program to sort an array of integers 
// using Arrays.sort(). It by default sorts in 
// ascending order 
import java.util.Arrays; 

public class SortExample 
{ 
    public static void main(String[] args) 
    { 
        // Our arr contains 8 elements 
        int[] arr = {13, 7, 6, 45, 21, 9, 101, 102}; 

        Arrays.sort(arr); 

        System.out.printf("Modified arr[] : %s", 
                          Arrays.toString(arr)); 
    } 
}

例子是来自https://www.geeksforgeeks.org/arrays-sort-in-java-with-examples/的sn-p

【讨论】:

  • 答案不应依赖链接获取大部分内容。链接可能会失效,或者可以更改另一侧的内容以不再回答问题。请编辑您的答案以包含您链接到的信息。
【解决方案4】:

按照实现后的算法,我已经为计数排序技术做了准备

public static int[] countSort(int elements[]) {
    int[] sorted = new int[elements.length+1];
    int[] range = new int[getMax(elements)+1];
    for(int i=0;i<range.length;i++) {
        range[i] = getCount(i, elements);
        try {
            range[i] = range[i]+range[i-1];
        }catch(ArrayIndexOutOfBoundsException ae) {
            continue;
        }
    }       

    for(int i=0;i<elements.length;i++) {
        sorted[range[elements[i]]] = elements[i];
        range[elements[i]] = range[elements[i]]-1;
    }       
    return sorted;
}

public static int getCount(int value,int[] elements) {
    int count = 0;
    for(int element:elements) {
        if(element==value) count++;
    }
    return count;
}

public static int getMax(int elements[]) {
    int max = elements[0];
    for(int i=0;i<elements.length;i++) {
        if(max<elements[i]) {
            max = elements[i];
        }           
    }
    return max;
}

如果有任何反馈,请查看并告诉我,这会更有帮助。 笔记 : 非负 no 将不支持上述实现。 不要使用排序数组的第 0 个索引。

【讨论】:

    猜你喜欢
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 2021-03-22
    • 1970-01-01
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多