【发布时间】:2016-10-22 10:56:15
【问题描述】:
尝试将 3 个数组合并为一个,以使最终数组有序。
给定
int[] a = {1,3};
int[] b = {2,4};
int[] c = {1,5};
合并数组,使最终数组 d = {1,1,2,3,4,5}
不能只是连接它们然后对 d 数组进行排序,因为这会使时间复杂度大于 Big-O(N)。
这是我到目前为止所得到的。遇到索引超出范围异常的问题:
public static void main(String[] args) {
// Sort these 3 arrays. The final array should be d = {1,1,2,3,4,5}
int[] a = {1,3};
int[] b = {2,4};
int[] c = {1,5};
int[] d = new int[a.length + b.length + c.length];
int i = 0;
int j = 0;
int k = 0;
int l = 0;
for (int iteration = 0; iteration <= d.length; iteration++){
if ((i != a.length || j != b.length) && a[i] < b[j]){
if (a[i] < c[k]){
// then a[i] is smallest
d[l] = a[i];
i++;
l++;
displayArrayContents(a,b,c,d,i,j,k,l);
}
else if (a[i] > c[k]){
// then c[k] is smallest
d[l] = c[k];
k++;
l++;
displayArrayContents(a,b,c,d,i,j,k,l);
}
else if (a[i] == c[k]){
d[l] = a[i];
i++;
l++;
d[l] = c[k];
k++;
l++;
displayArrayContents(a,b,c,d,i,j,k,l);
}
}
else if(b[j] < a[i]){
if (b[j] < c[k]){
// b[j] is smallest
d[l] = b[j];
l++;
j++;
displayArrayContents(a,b,c,d,i,j,k,l);
}
else if (b[j] > c[k]){
// c[k] is smallest
d[l] = c[k];
l++;
k++;
displayArrayContents(a,b,c,d,i,j,k,l);
}
else if (b[j] == c[k]){
d[l] = b[j];
j++;
l++;
d[l] = c[k];
k++;
l++;
displayArrayContents(a,b,c,d,i,j,k,l);
}
}
}
}
【问题讨论】:
-
that would make the time complexity larger than Big-O(N)...实际上一般可以达到的最佳性能大约是O(N*lgN),比O(N)差。因此,在一个初始的O(N)操作中将三个数组存储在一个位置很可能不会损害排序的整体性能。 -
研究分治法,如合并排序和快速排序。
-
@TimBiegeleisen 如果我能够通过 3 个数组中的每一个,将最小值分配给最终数组(如上面的实现),时间复杂度将如何超过 O( N)?
-
三个数组已经排序了吗?如果是,那么您可以在
O(N)中执行此操作。在一般情况下,这与任何其他排序问题没有什么不同。 -
合并排序数组的最佳情况是 O(n log k),其中 n 是项目的总数,k 是列表的数量。用于合并两个数组,结果为 O(n * log(2)),与 O(n) 相同。您的示例只是基于一般优先级队列的合并,硬编码有条件代替显式优先级队列。分析会发现最坏情况下的比较次数是O(n log k)。
标签: java algorithm sorting data-structures big-o