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

时间:2015-04-03 06:12:53

标签: java arrays

您好我正在尝试根据数组中值的出现次数对数组进行排序。因此,如果我的数组int[] a = new int[]{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. count[1] =4并存储2的计数,count[2] = 1存储3的计数,count[8] =2存储9的出现次数。我的计数应为count[i-1]到存储出现次数的数量,并根据我应该对数组进行排序的次数。第一个问题,我无法将数组a的出现次数存储到计数数组中。并根据发生次数我如何存储阵列。

1 个答案:

答案 0 :(得分:0)

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

int k = 9;
int[] count = new int[k];

请注意,此数组将在每个位置使用默认值0进行初始化,这需要O(k)时间和空间,因此它等效于:

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]++;
}

这需要O(n)时间,并且会导致:

count = {1, 4, 1, 2, 1, 0, 1, 2, 2}

完成此操作后,数组实际上已经排序。我们可以通过以下方式看到这一点:

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));

还需要O(n)时间和空间,以及输出:

[1, 2, 2, 2, 2, 3, 4, 4, 5, 7, 8, 8, 9, 9]

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