Javascript 合并两个数组并对最后一个数组进行排序

Javascript 合并两个数组并对最后一个数组进行排序,javascript,arrays,algorithm,sorting,Javascript,Arrays,Algorithm,Sorting,在一次采访中,我被问到以下问题。 我得到了两个数组,它们都已排序 但是 数组1将有几个-1,数组2将有总数作为数组1中-1的总数 在下面的例子中 array1有三个-1,因此array2有三个数字 比方说 var arrayOne = [3,6,-1,11,15,-1,23,34,-1,42]; var arrayTwo = [1,9,28]; 这两个数组都将被排序 现在我必须编写一个程序,通过替换-1将arrayTwo合并到arrayOne中,arrayOne应该按顺序排序 因此,输出将是

在一次采访中,我被问到以下问题。 我得到了两个数组,它们都已排序

但是

数组1将有几个-1,数组2将有总数作为数组1中-1的总数

在下面的例子中 array1有三个-1,因此array2有三个数字

比方说

var arrayOne = [3,6,-1,11,15,-1,23,34,-1,42];
var arrayTwo = [1,9,28];
这两个数组都将被排序

现在我必须编写一个程序,通过替换-1将arrayTwo合并到arrayOne中,arrayOne应该按顺序排序

因此,输出将是

arrayOne = [ 1,3, 6, 9, 11, 15, 23, 28 ,34, 42 ]
排序应在不使用任何排序API的情况下完成

我已经编写了以下代码

函数拼图01(){
var arrayOne=[3,6,-1,11,15,-1,23,34,-1,42];
var arrayTwo=[1,9,28];
var Array1计数器=0,
isMerged=false;
console.log(“array-1”,arrayOne);
console.log(“array-2”,arrayTwo);
对于(var array2Counter=0;array2CounterarrayOne[nextPointer]){
温度=阵列长度[x];
arrayOne[x]=arrayOne[nextPointer];
arrayOne[nextPointer]=临时;
hasSwapped=true;
}
}//为了
}while(hasSwapped==true);

}//bubbleSort
您可以在单个循环中迭代
数组一个
,然后在
数组两个

 3,  6, --, 11, 15, --, 23, 34, --, 42
 1,  9, 28
其思想是将目标索引与实际索引分开。第一个循环忽略
-1
,并保留目标索引

如果实际值大于
arrayTwo
的第一个值,则交换的值和arrayTwo中的值都将通过迭代和与更大的值交换进行排序

然后将实际项目分配给目标索引

两个索引都会递增

最后,将
arrayTwo
的所有项添加到
arrayOne

函数顺序(arrayOne,arrayTwo){
变量i=0,j,l=0;
while(iarrayTwo[j+1]){
[arrayTwo[j],arrayTwo[j+1]]=[arrayTwo[j+1],arrayTwo[j]];
j++;
}
}
arrayOne[l++]=arrayOne[i++];
}
j=0;
while(l

。作为控制台包装{max height:100%!important;top:0;}
您应该执行类似于插入排序的操作。由于两个数组都已排序(除-1s外),
array2
中的最小数字将放在第一个元素和第一个-1之间的某个位置,
array2
的第二个元素将放在
array1
中的第一个-1之后的任何位置,以及
array1
中的第二个-1之前或之前,依此类推


因此,您必须仅在
array1
的一段而不是整个数组中插入
array2
的特定元素。此外,<>代码> ARARY2中的每个元素都必须考虑<代码> > ARARY1不同的段或子数组。因此,此逻辑的有效时间复杂度将是
O(n+m)
,其中
n
array1
的长度,
m
array2
的长度。您应该使用merge函数from,并对其进行修改,使其不创建新数组,而是使用array1,并执行转换,从array2中插入一个元素后,这将使元素向右移动,直到下一个-1,从而覆盖-1。

难道不是这样吗

将ArrayTo的每个项目与arrayOne的每个项目进行比较 如果比arrayOne大,则插入该项,并在迭代arrayOne时删除所有-1。

功能合并(a1、a2){
var i=0;
var j=0;
而(ia2[j]){
//交换值
var-temp=a2[j];
a2[j]=a1[i];
a1[i]=温度;
i++;

}否则,如果(a1[i]!==-1&&a1[i]您可以尝试以下方法:

逻辑
  • 创建将返回的新数组
  • 检查
    数组two
    中的第一个元素,并将其保存在变量中,例如
    val
  • 数组上循环一个
    并检查当前值是否大于
    val
    ,将其推入数组并将
    i
    的值递减1,以检查下一个值以及当前元素
  • 现在检查当前元素。如果它小于
    0
    ,则忽略它,否则将值推送到数组
  • 返回此数组
函数mergeAndSort(a1、a2){
var-matchCount=0;
var-ret=[];
对于(变量i=0;ival){
返回推送(val)
匹配计数++
我--;
继续;
}
如果(a1[i]>0
 3,  6, --, 11, 15, --, 23, 34, --, 42

 3,  6, --, 11, 15, --, 23, --, 34, 42

 3,  6, --, 11, 15, --, --, 23, 34, 42

 3,  6, --, 11, --, --, 15, 23, 34, 42

 3,  6, --, --, --, 11, 15, 23, 34, 42

 3, --, --, --,  6, 11, 15, 23, 34, 42

 --, --, --, 3,  6, 11, 15, 23, 34, 42
  --, --, --,  3,  6, 11, 15, 23, 34, 42
   1,  9, 28

   1, --, --,  3,  6, 11, 15, 23, 34, 42
  --,  9, 28

   1,  3, --, --,  6, 11, 15, 23, 34, 42
  --,  9, 28

   1,  3,  6, --, --, 11, 15, 23, 34, 42
  --,  9, 28

   1,  3,  6,  9, --, 11, 15, 23, 34, 42
  --, --, 28

   1,  3,  6,  9, 11, --, 15, 23, 34, 42
  --, --, 28

   1,  3,  6,  9, 11, 15, --, 23, 34, 42
  --, --, 28

   1,  3,  6,  9, 11, 15, 23, --, 34, 42
  --, --, 28

   1,  3,  6,  9, 11, 15, 23, 28, 34, 42
  --, --, --
            public static void AMerge()
        {
            int[] array1 = new int[] { 3, 6, -1, 11, 15, -1, 23, 34, -1, 42 };
            int[] array2 = new int[] { 1, 9, 28 };
            int[] arrayMerged = new int[array1.Length];

            int array1Index = 0;
            int array2Index = 0;

            for (int arrayMergedIndex = 0; arrayMergedIndex < array1.Length; arrayMergedIndex++)
            {
                while (array1[array1Index] == -1) array1Index++; //ignore -1 placeholders
                if ((array1Index < array1.Length && array2Index >= array2.Length) 
                    || array1[array1Index] <= array2[array2Index])  //choose which array will provide current merged value
                {
                    arrayMerged[arrayMergedIndex] = array1[array1Index];
                    array1Index++;
                }
                else
                {
                    arrayMerged[arrayMergedIndex] = array2[array2Index];
                    array2Index++;
                }
            }

            char[] charsToTrim = { ',', ' '};
            string arrayMergedString = "{";
            foreach (int f in arrayMerged) arrayMergedString += f.ToString() + " ";
            arrayMergedString = arrayMergedString.TrimEnd(charsToTrim) + "}";
            Console.WriteLine(arrayMergedString);
            Console.ReadKey();
        }
    }