Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将奇数数组按升序排序,但将偶数保留在其位置?_Javascript_Arrays_Sorting_Modulus - Fatal编程技术网

Javascript 如何将奇数数组按升序排序,但将偶数保留在其位置?

Javascript 如何将奇数数组按升序排序,但将偶数保留在其位置?,javascript,arrays,sorting,modulus,Javascript,Arrays,Sorting,Modulus,我只想对奇数进行排序,而不移动偶数。例如,当我写作时: sortArray([5,3,2,8,1,4]) 预期结果是: [1,3,2,8,5,4] 我是JavaScript新手,在互联网上遇到了一个让我困惑的挑战。我通常不会在互联网上发布要求解决方案的帖子,但我已经尝试了几个小时,我想用JavaScript学习这个概念 挑战指出: 你有一个数字数组。 您的任务是对递增奇数进行排序,但偶数必须在其位置上。 零不是一个奇数,你不需要移动它。如果有空数组,则需要返回它 这是我到目前为止的代码,请放

我只想对奇数进行排序,而不移动偶数。例如,当我写作时:

sortArray([5,3,2,8,1,4])
预期结果是:

[1,3,2,8,5,4]
我是JavaScript新手,在互联网上遇到了一个让我困惑的挑战。我通常不会在互联网上发布要求解决方案的帖子,但我已经尝试了几个小时,我想用JavaScript学习这个概念

挑战指出:

你有一个数字数组。 您的任务是对递增奇数进行排序,但偶数必须在其位置上。 零不是一个奇数,你不需要移动它。如果有空数组,则需要返回它

这是我到目前为止的代码,请放心,我正处于编程的开始阶段

函数排序(数组){
设oddNums=[];
for(设i=0;ia-b);
数组.concat(oddNums);
array=array.sort((a,b)=>a-b);
返回数组;
}
只要做:

arr.sort((a, b) => a%2 && b%2 ? a - b : 0)
这取决于浏览器使用的排序算法。 独立于浏览器的版本:

for(const [i1, v1] of arr.entries())
  for(const [i2, v2] of arr.entries())
    if( v1%2 && v2%2 && (i1 < i2) === (v1 > v2))
        ([arr[i1], arr[i2]] = [v2, v1]);
for(数组项()的常量[i1,v1])
for(数组项()的常数[i2,v2])
如果(v1%2&&v2%2&&(i1v2))
([arr[i1],arr[i2]]=[v2,v1]);

以下是一个可能的解决方案,使用稍微定制的:

var xs=[5,3,2,8,1,4]; log(sortOddsOnly(xs)); 函数SortodsOnly(xs){ var n=xs.length; 对于(变量i=0;ixs[j]){ var min=xs[j]; xs[j]=xs[i]; xs[i]=min; } } } } } 返回xs;
}我有一个这样的解决方案。
首先构建已排序的奇数数组,然后按顺序填充其余的偶数:

const arr=[5,3,2,8,1,4];
常量奇数=arr.filter(i=>i%2!==0).sort();
设i=0,
结果=[];
arr.forEach(e=>{
如果(e%2==0){
结果:推(e)
}否则{
结果推(奇数[i]);
i++;
}
});

控制台日志(结果)您可以为奇数索引获取一个助手数组,为奇数获取另一个助手数组,对它们进行排序,并将它们应用到原始数组先前存储的索引上

var数组=[5,3,2,8,1,4],
指数=[];
排列
.filter((v,i)=>v%2&&index.push(i))
.sort((a,b)=>a-b)
.forEach((v,i)=>数组[索引[i]]=v);

console.log(数组)这是一个主要使用内置数组方法的解决方案。获取一个仅包含赔率的列表,对其进行排序,然后映射原始项目,如果项目为奇数,则将每个项目替换为第一个排序的奇数,如果项目为偶数,则替换为项目本身:

const数组=[5,3,2,8,1,4]//收件人:[1,3,2,8,5,4]
函数SortodsOnly(arr){
常数赔率=arr
.filter(x=>x%2)
.sort((a,b)=>a-b);
返回arr
.map(x=>x%2?赔率.shift():x);
}

log(SortodsOnly(数组))可能的解决方案之一就是这样。我所做的是创建一个新的数组
odd
(使用在原始数组中具有奇数位置的数组),然后使用对该数组进行排序。然后使用将原始数组中所有奇数元素的值更改为
odd
数组

x1=[5,3,2,8,1,4];
函数sortArray(数组){
var odd=array.filter((x,i)=>(i+1)%2.sort((a,b)=>a>b);//对奇数位置进行排序并将其存储在新数组中
返回array.map((x,i)=>(i+1)%2?odd.shift():x);//如果i为奇数,则将其替换为来自的元素
//奇数数组,否则保持元素不变
}

控制台日志(Sortaray(x1))我认为这不会保留偶数的位置。@titus它实际上应该。。。但是它没有:/它没有为问题中的数组输出'true'。是的,排序会提前停止。只需运行几次,就可以看到它的神奇之处。它输出[3,5,2,8,1,4]@Nina Scholz数组位于问题的顶部如果你只是想寻找一个解决方案来尝试反向工程来理解,挑战和解决方案就会发布。我想创建一个奇数索引数组,然后通过索引数组将数组排序为奇数。注意:。我赢了,尽管选择排序是O(n*n):-d首先,它不是一种函数方法,即使它看起来像,但最后一行会改变数组,其次,每个解决方案都需要迭代以识别奇数值,然后需要对这些值进行排序,然后需要将排序后的值放回原来的位置,通过迭代奇数集,或者像CRice迭代整个数组的另一个好答案一样,在新数组中映射偶数和移位排序的奇数值。通过假设一个变异,这是op给定函数的特征,我这样做了。谁说你不应该迭代?非常清楚地说,第一个问题是当n很大时,解决方案的时间成本,而在我看来,第二个问题是,为了获得更多的声誉,你在用华丽的OneLiner误导初学者。想想有多少人因为你而自豪地产生了耗时的代码:-(这看起来像Python,当时JavaScript需要解决方案。这个解决方案很有效,但对于负数,你需要用
Math.abs
包围
-3%2
-1
)。
def sort_array(source_array):
b = sorted([n for n in source_array if  n % 2 != 0])
c = -1
d = []
for i in source_array:
    c = c+1
    if i % 2 != 0 :
        d.append(c)
for x in range (len(d)):
    z = d[x]
    source_array[z] = b[x]
return source_array