javascript - 有人能告诉我为什么这段 JavaScript 代码没有按顺序排列数组吗?

标签 javascript sorting

在线代码:http://jsfiddle.net/fCUZC/

//INPUT ARRAY:
var input = [28,32,21,11,8,2,14,32,64];
//VARIABLE DECLARATION. a = highest number so far, b = position of that number
entireLoop:
for (var i = 1; i<=input.length; i++)
{
    if(input[i] > input[i-1])
    {
        for(var o = i; o>=0; o--)
        {
            if(input[i-1] > input[o])
            {
                input.splice(i,0,input[o]);
                input.splice((o+1),1);
                continue entireLoop;
            }
            else if(input[o] > input[0])
            {
                input.splice(0,0,input[o]);
                input.splice((o+1),1);
                continue entireLoop;
            }

        }
    }
}
document.write(input);

我正在尝试将数组从大到小排序,但某处卡住了 32。我知道有 sort 方法,但我是新手,想亲自尝试一下。

最佳答案

** 编辑 ** 首先看一下 Array 的 native .sort() 方法。它完整​​地保留原始数组并接受比较函数。后者使 .sort() 非常强大。

var input = [28,32,21,11,8,2,14,32,64];

var low2high = function ( a , b ) {
    return a > b;
};

var high2low = function ( a , b ) {
    return a < b;
};

var resultHigh2low = input.sort( high2low ); // [ 64,32,32,28,21,14,11,8,2 ];
var resultLow2high = input.sort( low2high ); // [ 2,8,11,14,21,28,32,32,64 ];

因此,如果我们想使用 bubbleSort(T.J. Crowder 提供的链接,请参阅 OP 评论),我们可以编写以下内容:

// javascript bubbleSort implementation
var bubbleSort = function ( list , comparison ) {
    var swapped;
    var i;
    var val;

    list = [].concat( list ); // do not destroy original
    comparison = ( typeof comparison == "function" ) ? comparison : function(a,b){return a > b;}

    do {
        i = list.length;
        while ( --i ) {
           if ( i && comparison( list[ i ] , comparison[ i-1] ) ) {
                val = list[ i ];
                list[ i ] = list[ i - 1 ];
                list[ i - 1] = val;
                swapped = true;
           }
        }
    } while ( swapped );
    return list;
}

// using comparison functions from previous example.
var resultHigh2low = bubbleSort( input , high2low ); // [ 64,32,32,28,21,14,11,8,2 ];
var resultLow2high = bubbleSort( input , low2high ); // [ 2,8,11,14,21,28,32,32,64 ];

让我们一步步过一遍:

var bubbleSort = function ( list , comparison ) {
    ..code..
}

我们的函数接受 2 个参数,第一个是数组,第二个是可选的比较函数。

var swapped;
var i = list.length;
var val;

我们将列表的长度存储在变量 i 下,并声明 2 个空变量(swappedval)我们稍后会用到上。

list = [].concat( list ); // do not destroy original

我们使用 [].concat( array ) 克隆列表并覆盖本地 list 变量,保持原始不变。

comparison = ( typeof comparison == "function" ) ? comparison : function(a,b){return a > b;}

我们测试 typeofcomparison 参数,如果它是一个 function 我们使用那个,否则我们退回到我们自己的 比较功能。如果 a 大于 b,我们的回退比较函数将返回 true

do {
    ..code..
} while ( swapped );

一个 do/while 循环将至少运行一次,我们的 swapped 变量当前是 undefined 因此它将被解释为 falsy。如果我们的 comparison 函数返回 true,则会发生交换,并且 swapped 变量将设置为 true,因此它会再次循环。

while ( --i ) {
    ..code..
}

这里我从列表的长度向下循环,-- 运算符放在 i 变量之前,以确保它在任何事情之前首先被处理,i- - 将在 while 评估后关闭,导致错误结果,因为 list[ list.length ] 不存在。我总是这样做(也许是坏习惯),但如果它让你感到困惑,请追求绝对透明。

if ( i && comparison( list[ i ] , comparison[ i-1] ) ) {
    ..code..
}

首先我们检查 i 是否有真值(0 计算为假)然后我们运行 comparison 函数传递 list[ i ]list[ i - 1 ] 作为 ab 参数。如果 comparison 函数返回 true,我们将执行交换。

val = list[ i ];
list[ i ] = list[ i - 1 ];
list[ i - 1] = val;
swapped = true;

这里我执行交换时没有使用 .splice() 方法,这只是一个有根据的猜测,但我认为直接赋值比函数调用更快。我使用 val 变量作为占位符。交换完成后,我将 swapped 设置为 true,这样我们的 do/while 循环就会继续。

return list;

嗯……返回结果。

我已经排除了一些检查,比如当列表的长度为 0 时我们要做什么等等。基本上在编写辅助函数时,我们还需要处理错误处理。例如,当传递的比较参数不是函数时抛出 TypeError,确保比较方法返回 bool 值等。

关于javascript - 有人能告诉我为什么这段 JavaScript 代码没有按顺序排列数组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4552847/

相关文章:

python - 在python中对字母数字字典键进行排序

java - 按 ArrayList 中 ArrayList 的第一个条目排序

algorithm - 以功能方式拆分流

javascript - 使用 .map 比较数组 (ReactJS)

javascript - Vue3-使用 Vitest toHaveBeenCalled() 方法

javascript - 如何在不使用事件的情况下获取元素的 pageX 和 pageY

java - 如何将这种类型的数据处理成Array - JAVA

javascript - 分配给匿名函数的变量未定义

JavaScript 代码不起作用。为什么?

java - java中从最高到最低数字的冒泡排序