我正在寻找一个解决方案,我们在整数数组中有一系列元素k [1-4]说[1,2,1,3,4,2,1,3,2,3,1] ,4,2]像这样,它们需要在Core Java中以最小的时间复杂度进行排序。
有人可以帮我解决这个问题,时间复杂度最低。
答案 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)
Counting sort最适合这种情况。它具有线性(O(n + k))复杂度。
答案 4 :(得分:0)
如果你只是排序intregers Arrays.sort()(Quicksort)可能是最好的方法,我通常编写自己的排序接口,所以我可以有一个带有compareTo(Obj,Obj)的接口,其中我可以将2. Obj设置为参数,以便在不同的分类中进行排序。例如。如果我想用视图排序,我传递1,如果我喜欢排序,则传递2。
如果你有很多要排序的数据(例如碎片整理),这可能比你有可用的更多ram,你会使用mergesort,因为你不需要在你的ram中拥有所有数据来对它进行排序。