java - Java 计数排序 - 意外结果

标签 java sorting counting-sort

class CountingSort {

    int[] csort(int[] arr) {
        int n = arr.length;
        int max = arr[0];
        int[] out = new int[n];
        for (int i : arr) {
            if (max < i) {
                max = i;
            }
        }
        int range = max + 1;
        int[] te = new int[range];
        for (int i = 0; i < range; ++i) {
            te[i] = 0;
        }
        for (int j = 1; j < n; j++) {
            te[arr[j]] = te[arr[j]] + 1;
        }
        // case1: {0,0,0,1,0,1,1,0,1,1}
        // case2: {0,0,0,1,0,1,1,0,1,1}
        for (int k = 1; k < range; ++k) {
            te[k] = te[k] + te[k - 1];
        }
        // case1: {0,0,0,1,1,2,3,3,4,5}
        // case2: {0,0,0,1,1,2,3,3,4,5}
        for (int l = n - 1; l >= 0; --l) {
            out[te[arr[l]]] = arr[l];
            te[arr[l]] = te[arr[l]] - 1;
        }
        return out;
    }

}

以上是计数排序的代码。以下是我的观察

  1. 如果输入数组中最小的元素是第一个元素,例如 {1, 6, 8, 3, 5, 9} 它会给出预期的输出 {1, 3, 5, 6 , 8, 9}
  2. 但是,如果给定的输入数组的第一个元素不是最小的,例如 {4, 6, 8, 3, 5, 9} 则输出的第一个元素为零,并且缺少一个数字。 我已经尝试过,但似乎无法找到这是如何发生的。

最佳答案

用于计数出现次数的循环不会迭代所有元素,您将跳过 arr[0]

for (int j = 0; j < n; j++) {
    te[arr[j]] = te[arr[j]] + 1;
}

此外,你可以用更“优雅”的方式来编写它:

for (int j = 0; j < n; ++te[arr[j]], ++j);

关于java - Java 计数排序 - 意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47741761/

相关文章:

java - 如何在2个定时器之间互换?在 Java 图形用户界面中

MySQL按 "relationships per day"排序

sorting - 我需要按相关性对从 SOLR 返回的方面进行排序

c++ - 计数排序 : Why we need sum of previous counts?

algorithm - 修改输入数组的计数排序实现

java - 计数排序/排序算法的变体

java - 如何将 JNDI 名称动态插入 Spring

java - Log4j 类别/记录器的更改相互影响

java - 运行包含 junit 的 jar

php - 是否可以使快速排序函数对数组进行降序排序?