如何按升序对奇数数组进行排序,但在偶数位置保持偶数?

时间:2018-03-22 19:58:20

标签: javascript arrays sorting modulus

我想在不移动偶数的情况下对奇数进行排序。例如,当我写:

sortArray([5, 3, 2, 8, 1, 4])

预期结果是:

[1, 3, 2, 8, 5, 4]

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

挑战表明:

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

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

function sortArray(array) {
  let oddNums = [];
  for(let i = 0; i < array.length; i++) {
    if(array[i] % 2 !== 0) {
      oddNums.push(array[i]);
    }
  }
  oddNums = oddNums.sort((a,b)=> a-b);
  array.concat(oddNums);
  array = array.sort((a,b) => a-b);
  return array;
}

7 个答案:

答案 0 :(得分:5)

您可以为奇数索引获取辅助数组,为奇数索引获取另一个数组,对它们进行排序并将它们应用于先前存储的原始数组索引。

var array = [5, 3, 2, 8, 1, 4],
    indices = [];

array
    .filter((v, i) => v % 2 && indices.push(i))
    .sort((a, b) => a - b)
    .forEach((v, i) => array[indices[i]] = v);

console.log(array);

答案 1 :(得分:2)

这是一个主要使用内置数组方法的解决方案。只获取赔率列表,排序,然后通过原始地图进行映射,如果项目是奇数,则用第一个排序的奇数替换每个项目,如果是偶数则替换为自己:

const array = [5, 3, 2, 8, 1, 4] // to: [1, 3, 2, 8, 5, 4]

function sortOddsOnly(arr) {
    const odds = arr
        .filter(x => x%2)
        .sort((a, b) => a - b);
        
    return arr
        .map(x => x%2 ? odds.shift() : x);
}

console.log(sortOddsOnly(array));

答案 2 :(得分:1)

我有这样的解决方案。
构建排序的奇数数组1st,然后按顺序填充其余的偶数:

const arr = [5, 3, 2, 8, 1, 4];

const odd = arr.filter(i => i%2 !== 0).sort();
let i = 0,
  result = [];
arr.forEach(e => {
  if (e%2 === 0) {
    result.push(e)
  } else {
    result.push(odd[i]);
    i++;
  }
});

console.log(result);

答案 3 :(得分:0)

只是这样做:

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]);

答案 4 :(得分:0)

以下是使用略微定制的selection sort

的可能解决方案

EOF

前两个var xs = [5, 3, 2, 8, 1, 4]; console.log(sortOddsOnly(xs)); function sortOddsOnly (xs) { var n = xs.length; for (var i = 0; i < n - 1; i++) { if (xs[i] % 2 === 1) { for (var j = i + 1; j < n; j++) { if (xs[j] % 2 === 1) { if (xs[i] > xs[j]) { var min = xs[j]; xs[j] = xs[i]; xs[i] = min; } } } } } return xs; }保证我们只交换奇数(if表示“x是奇数”)。

答案 5 :(得分:0)

可能的解决方案之一就是这个。我所做的是使用 Array.prototype.filter 创建新数组odd(原始数组中具有奇数位置的数组),然后使用 Array.prototype.sort <对该数组进行排序/ strong>即可。然后使用 Array.prototype.map 使用odd数组更改原始数组的所有奇数元素的值。

&#13;
&#13;
x1=[5, 3, 2, 8, 1, 4];
function sortArray(array) {
  var odd = array.filter((x,i) => (i+1) % 2 ).sort((a,b) => a > b); //sort odd position and store that in new array
  return array.map((x,i) => (i+1) % 2 ? odd.shift() : x ); //if i is odd then replace it with element from 
                                                  //odd array otherwise keep the element as it is
}
console.log(sortArray(x1));
&#13;
&#13;
&#13;

答案 6 :(得分:-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