Java 根据出现次数对数组进行排序

Java 根据出现次数对数组进行排序,java,arrays,Java,Arrays,您好,我正在尝试根据数组中值的出现次数对数组进行排序。如果我的数组int[]a=newint[]{9,2,4,8,9,4,3,2,8,1,2,7,2,5};我的数组计数应该是:count[i-1],根据数组的值,我的count数组如下:1 4 1 2 1 0 1 2 2,因此count[0]=1存储1的计数。计数[1]=4并存储2的计数,计数[2]=1存储3的计数,计数[8]=2存储9的出现次数。我的计数应该是count[i-1],以存储出现次数,并根据出现次数对数组进行排序。第一个问题,我在将

您好,我正在尝试根据数组中值的出现次数对数组进行排序。如果我的数组int[]a=newint[]{9,2,4,8,9,4,3,2,8,1,2,7,2,5};我的数组计数应该是:count[i-1],根据数组的值,我的count数组如下:1 4 1 2 1 0 1 2 2,因此count[0]=1存储1的计数。计数[1]=4并存储2的计数,计数[2]=1存储3的计数,计数[8]=2存储9的出现次数。我的计数应该是count[i-1],以存储出现次数,并根据出现次数对数组进行排序。第一个问题,我在将数组a的出现次数存储到计数数组中时遇到问题。根据出现的次数,如何存储数组。

第一步是遍历数组,存储每个数字出现的次数。假设数组只能包含从1到k的元素,因此我们需要一个可以存储k个元素的计数数组:

int k = 9;
int[] count = new int[k];
请注意,此数组将在每个位置用默认值0初始化,这需要确定的时间和空间,因此相当于:

int[] count = {0, 0, 0, 0, 0, 0, 0, 0, 0};
因此,所有元素的初始计数均为0

现在我们计算数组中的元素

例如:

int[] a = new int[]{9,2,4,8,9,4,3,2,8,1,2,7,2,5};
// Go through each element of this array:
int n = a.length
for (int i = 0; i < n; i++) {
    // Add 1 to the corresponding position in the count array.
    int position = a[i] - 1;
    count[position]++;
}
完成此操作后,数组实际上已排序。我们可以通过以下方式看到这一点:

int[] sorted = new int[n];
int h = 0;
for (int i = 0; i < count.length; i++) {
    for (int j = 0; j < count[i]; j++) {
        // Sum 1 to i to get the original number
        sorted[h++] = i + 1;
    }
}

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

因此,该算法的总时间和空间复杂度为+k,这意味着它在项数加上最大和最小键值之间的差值上线性运行。

如果a[i]的上界稍小,那么我建议计算Sorts,因为我只看到需求。你在实现它时遇到了什么困难?@ZiadHalabi是的。这可能就是解决办法。但我觉得这很复杂。简单的计数排序就可以了。只是一个thought@sathiyaseelanOP在将数组a的出现次数存储到计数数组中时遇到问题,我不确定他/她是否可以实现计数排序。请提供您当前的代码,并解释将数组a的出现次数存储到计数数组中有什么问题。这样,我们就可以为您的问题提供准确的帮助。这个排序算法可以优化吗?我不这么认为,因为它已经在+k上了。我更新了答案以显示这一点。我清楚地理解了它。非常感谢。
int[] sorted = new int[n];
int h = 0;
for (int i = 0; i < count.length; i++) {
    for (int j = 0; j < count[i]; j++) {
        // Sum 1 to i to get the original number
        sorted[h++] = i + 1;
    }
}

System.out.println(Arrays.toString(sorted));
[1, 2, 2, 2, 2, 3, 4, 4, 5, 7, 8, 8, 9, 9]