在线代码: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 个空变量(swapped
和 val
)我们稍后会用到上。
list = [].concat( list ); // do not destroy original
我们使用 [].concat( array )
克隆列表并覆盖本地 list
变量,保持原始不变。
comparison = ( typeof comparison == "function" ) ? comparison : function(a,b){return a > b;}
我们测试 typeof
和 comparison
参数,如果它是一个 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 ]
作为 a
和 b
参数。如果 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/