在数组上使用Javascript.sort()将所有零放在末尾
我正在尝试对数组进行排序,以便所有的零都位于末尾。但是,我不希望列表按数字排序,所有零以上的数字应该保持相同的顺序。以下是到目前为止我得到的信息:在数组上使用Javascript.sort()将所有零放在末尾,javascript,arrays,sorting,Javascript,Arrays,Sorting,我正在尝试对数组进行排序,以便所有的零都位于末尾。但是,我不希望列表按数字排序,所有零以上的数字应该保持相同的顺序。以下是到目前为止我得到的信息: function placeZerosAtEnd(arr) { return arr.sort(compareForSort); } function compareForSort(first, second) { return first == 0 ? 1 : 0; } placeZerosAtEnd([9,0,9,1,0,2,0,
function placeZerosAtEnd(arr) {
return arr.sort(compareForSort);
}
function compareForSort(first, second) {
return first == 0 ? 1 : 0;
}
placeZerosAtEnd([9,0,9,1,0,2,0,1,1,0,3,0,1,9,9,0,0,0,0,0]);
这应该返回[9,9,1,2,1,1,3,1,9,0,0,0,0,0,0,0,0,0,0],但实际返回[3,9,9,1,9,2,9,1,1,1,0,0,0,0,0,0,0,0]。零是正确的,但其他数字的顺序很奇怪。这是怎么回事
在您的示例中,
sort
函数正是它的本意
您期望的是稳定排序
,但javascript排序算法不能保证稳定排序
有关javascript中稳定排序的讨论,请参阅。我认为使用
sort
函数无法实现这一点。根据浏览器使用的排序方法(快速排序、合并排序等),sort
功能通过将项目交换到位来工作。所以不知道非零会在哪里结束。。。您的算法只是确保它们出现在0之前
这里有一个函数可以完成您正在尝试的功能:
function placeZerosAtEnd(arr) {
for(var i = 0 ; i < arr.length ; i++) {
if(arr[i]===0) arr.splice(arr.length-1, 0, arr.splice(i, 1)[0]);
}
return arr;
}
函数placeZerosAtEnd(arr){
对于(变量i=0;i
正如其他人所说,在本例中使用.sort()是错误的。这是我最后使用的代码,正如elclanrs在我最初的帖子下面的评论中所建议的那样
function placeZerosAtEnd(arr) {
return arr.filter(isntZero).concat(arr.filter(isZero));
}
function isntZero(element) {
return element > 0;
}
function isZero(element) {
return element == 0;
}
你也可以用这种方法
let listSort=[9,0,9,1,0,2,0,1,1,0,3,0,1,9,9,0,0,0,0,0],
isntZero=[],
isZero=[]
for(设i=0;i console.log(JSON.stringify(output))
使用排序的简单解决方案:将零与非零进行“向下冒泡”:
[9,0,9,1,0,2,0,1,1,0,3,0,1,9,9,0,0,0,0,0].sort((a, b) => {
if (a !== 0 && b === 0) return -1;
if (a === 0 && b !== 0) return 1;
return 0;
})
// [9, 9, 1, 2, 1, 1, 3, 1, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
您可以使用arr.sort来解决此问题
参考:
我猜这是因为快速排序(“分而治之”)所以它是一种排序算法行为。你可以做xs.filter(isntZero)。concat(xs.filter(isZero))
谢谢@elclars很好的解决方案。我用你的小提琴得到了预期的结果。您是否也尝试过处理second
为0
的情况?
function placeZerosAtEnd(arr) {
arr.sort(function(key1,key2) {
if (key1 == 0 ) return 1;
return -1;
});
return arr;
}