题目为:将两个已知的,已经排好序的升序数组arr1和arr2,整合为一个仍未升序的新数组arr3,时间复杂度最小的办法是什么?
例:arr1 = [2,4,7,13], a2 = [1,3,5,6,7,9],
得到:arr3 = [1,2,3,4,5,6,7,7,9,13]
我想到的方法如下:
var a1 = [2,4,7,13], a2 = [1,3,5,6,7,9];
function sortAB(a1, a2) {
var i = 0,
j = 0,
a3 = [];
var length = a1.length + a2.length;
for(let k=0; k<length; k++){
if(a1[i] < a2[j]) {
a3.push(a1[i]);
i++;
} else {
a3.push(a2[j]);
j++;
}
}
return a3;
}
console.log(sortAB(a1, a2));
但得出的结果却是 [1,2,3,4,5,6,7,7,9,undefined]
求问原因何在???如何解决???
应为你13大于a2中所有元素,所有还是执行else,但是j++大于数组长度导致压入了undefined,并且a1的最大值没有压入,要做个判断是否已经越界
var a1 = [2, 4, 7, 13], a2 = [1, 3, 5, 6, 7, 9];
function sortAB(a1, a2) {
var i = 0,
j = 0,
a3 = [];
var a1l=a1.length,a2l=a2.length
var length = a1l + a2l;
for (let k = 0; k < length; k++) {
if (a1[i] < a2[j]) {
if (i < a1l) {
a3.push(a1[i]);
i++;
} else {//压入b中所有剩余元素
for (var l = j; l < a2l; l++) a3.push(a2[l]);
break;
}
} else {
if (j < a2l) {
a3.push(a2[j]);
j++;
}
else {//压入a中所有剩余元素
for (var l = i; l < a1l; l++) a3.push(a1[l]);
break
}
}
}
return a3;
}
console.log(sortAB(a1, a2));
最简单的排序
var arr1=[1,2,3,4,5];
var arr2=[6,7,10,11,22,23];
function sort(arr1,arr2){
var arr3=arr1.concat(arr2).sort((a,b)=>{ return a-b});
console.log(arr3)
}
sort(arr2,arr1);
首先 肯定是判断除了问题,a1 13最大值,导致条件恒不满足 所以在循环终止时都是在添加push(a2[j]);所以要稍微修改下判断条件即可。
这样判断类似 var a1 = [2,3,5,6,7,9], a2 = [2,3]; 这样的 a2.length<a1.lenght 数组也会出现问题
一般长短循环比较 都是用较短的那一个长度,作为循环判断标准,
所以 代码
function sortAB(a1, a2) {
var i = 0,
j = 0,
a3 = [];
var length = a1.length + a2.length;
if(a1.length>a2.length){
var temp = a1;
a1 = a2;
a2 = temp;
}
for(let k=0; k<length; k++){
if(a1[i] <= a2[j]||!a2[j]) {
a3.push(a1[i]);
i++;
} else {
a3.push(a2[j]);
j++;
}
}
return a3;
}
插入排序
var arr1=[1,2,3,4,5];
var arr2=[6,7,10,11,22,23];
function sort(arr1,arr2){
var arr3=arr1.concat(arr2);
for(var i=0;i<arr3.length;i++){
var t=arr3[i];
var p=i-1;
while(arr3[p]>t&&p>=0){
arr3[p+1]=arr3[p];
p--;
}
arr3[p+1]=t;
}
return arr3;
}
console.log(sort(arr2,arr1));//[ 1, 2, 3, 4, 5, 6, 7, 10, 11, 22, 23 ]
对两个已经有序的数组排序,最好是归并
var a1 = [2,4,7,13], a2 = [1,3,5,6,7,9];
function sortAB(a1, a2) {
var i = 0,
j = 0,
a3 = [];
// 先把a1或者a2完全装入到a3中
while (i < a1.length && j < a2.length) {
if(a1[i] < a2[j]) {
a3.push(a1[i]);
i++;
} else {
a3.push(a2[j]);
j++;
}
}
// 如果a1有剩余, 将剩余元素装入a3
for (; i < a1.length; i++) a3.push(a1[i]);
// 如果a2有剩余, 将剩余元素装入a3
for (; j < a2.length; j++) a3.push(a2[i]);
return a3;
}
console.log(sortAB(a1, a2));
先把数组合并,在用sort()排序就行
错就错在你的算法有问题,因为你的那个写法是永远不可能把最大的值加进去的,为什么?因为你所加的都是两个数组中相对较小的一个,因此13是不可能加到里面去的
而又因为你定死了length。所以最后加了个未定义的类别“undefined”,懂?
如果想得到排好序的数组,最好还是用conact还有sort方法
最小时间复杂度O(n)