我想在不使用sort()的情况下按升序或降序对数组值进行排序。
我已经创建了一个函数,但是我对此并不满意。 我相信下面的代码可能会更短,更简洁。
请让我知道在哪里进行修改,否则您也可以完全更改代码。先感谢您。
const func = arg => {
let flip = false;
let copy = [];
for(let val of arg) copy[copy.length] = val;
for(let i=0; i<arg.length; i++) {
const previous = arg[i-1];
const current = arg[i];
if(previous > current) {
flip = true;
copy[i] = previous;
copy[i-1] = current;
}
}
if(flip) return func(copy);
return copy;
};
l(func([5,2,8,1,9,4,7,3,6]));
答案 0 :(得分:0)
如果输入由整数组成(例如在示例中),则pne选项是将数组简化为一个对象,该对象的键是数字,其值是到目前为止这些值出现的次数。然后,在对象上进行迭代(对于整数键,其Object.entries
将按照升序数字键顺序进行迭代),并创建要返回的数组:
const func = arr => {
const valuesObj = {};
arr.forEach((num) => {
valuesObj[num] = (valuesObj[num] || 0) + 1;
});
return Object.entries(valuesObj)
.flatMap(
([num, count]) => Array(count).fill(num)
);
};
console.log(
func([5,2,8,1,9,10,10,11,4,7,3,6])
);
此过程运行时间为O(N)
。
要在保持O(N)
运行时的同时还要考虑负整数,请为负创建另一个对象:
const func = arr => {
const valuesObj = {};
const negativeValuesObj = {};
arr.forEach((num) => {
if (num >= 0) valuesObj[num] = (valuesObj[num] || 0) + 1;
else negativeValuesObj[-num] = (negativeValuesObj[-num] || 0) + 1;
});
return [
...Object.entries(negativeValuesObj).reverse()
.flatMap(
([num, count]) => Array(count).fill(-num)
),
...Object.entries(valuesObj)
.flatMap(
([num, count]) => Array(count).fill(num)
)
];
};
console.log(
func([5,2,8,1,-5, -1, 9,10,10,11,4,7,3,6, -10])
);
对于非整数项目,您必须使用具有更高计算复杂度的其他算法。