对包含一系列元素k的整数数组进行排序

时间:2013-07-28 11:13:19

标签: java sorting

我正在寻找一个解决方案,我们在整数数组中有一系列元素k [1-4]说[1,2,1,3,4,2,1,3,2,3,1] ,4,2]像这样,它们需要在Core Java中以最小的时间复杂度进行排序。

有人可以帮我解决这个问题,时间复杂度最低。

5 个答案:

答案 0 :(得分:2)

计算你有多少1s,2s,3s和4s,然后按照计数把数字放回去:

int[] count = new int[5]; // 0..4
for (int a : data) {
    data[a]++;
}
int p = 0;
for (int i = 0 ; i != count.length ; i++) {
    for (int j = 0; j != count[i] ; j++) {
        data[p++] = i;
    }
}

尽管有两个嵌套循环,但它具有线性时间复杂度,因为执行最内层赋值的次数恰好等于原始数组中的项目数。

答案 1 :(得分:1)

您只需扫描输入一次,计入数组并再次展开;据我所知,这会给n+m复杂性,其中n是数组的长度,m是范围的长度;如果你使用有序的O(1)哈希而不是数组,你可以将它推到O(n)附近。

    int range_min = 1, range_max = 4;

    int[] input        = {1, 2, 1, 3, 4, 2, 1, 3, 2, 3, 1, 4, 2};
    int[] output       = new int[input.length];
    int[] intermediate = new int[range_max-range_min+1];

    for(int num : input)                        
        intermediate[num-range_min]++;

    int cnt = 0;
    for(int i=0; i<range_max-range_min+1; i++)  
        for(int j=0; j<intermediate[i]; j++)
            output[cnt++] = i+range_min;

答案 2 :(得分:0)

可能Arrays.sort(...)具有最小的时间复杂度,因为它是直接在Java中可用的解决方案。更重要的是它基于Quicksort(平均复杂度O(n lg n)),因此很有可能它将成为最佳解决方案。

答案 3 :(得分:0)

当k是“小范围”时,

Counting sort最适合这种情况。它具有线性(O(n + k))复杂度。

答案 4 :(得分:0)

如果你只是排序intregers Arrays.sort()(Quicksort)可能是最好的方法,我通常编写自己的排序接口,所以我可以有一个带有compareTo(Obj,Obj)的接口,其中我可以将2. Obj设置为参数,以便在不同的分类中进行排序。例如。如果我想用视图排序,我传递1,如果我喜欢排序,则传递2。

如果你有很多要排序的数据(例如碎片整理),这可能比你有可用的更多ram,你会使用mergesort,因为你不需要在你的ram中拥有所有数据来对它进行排序。

相关问题