簡體   English   中英

誰能告訴我為什么這個JavaScript代碼沒有按順序排列一個數組?

[英]Can someone tell me why this JavaScript code isn't lining up an array in order?

實時代碼: 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()方法。 它保持原始數組不變,並接受比較函數。 后者使.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(TJ 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 ,我們使用的是一個,否則我們依傍我們自己的comparison功能。 如果a大於b我們的后備比較函數將返回true

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

do / while循環將至少運行一次,我們的swapped變量當前undefined因此將被解釋為虛假。 如果我們的comparison函數返回true,則會發生交換,並且swapped變量將被設置為true,因此它將再次循環。

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

在這里,我從列表的長度開始向下循環,將--運算符放在i變量之前,以確保首先在任何變量之前對其進行處理;由於list[ list.length ]不存在,因此while評估會導致錯誤的結果之后i--將關閉。 我總是這樣做(可能是壞習慣),但是如果讓您感到困惑,請絕對透明。

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

首先,我們檢查i是否具有真實值(0等於falsy),然后運行comparison函數,將list[ i ]list[ i - 1 ]作為ab參數傳遞。 如果comparison函數返回true ,則執行交換。

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

在這里,我不使用.splice()方法執行交換,這只是有根據的猜測atm。但是我認為直接分配比函數調用要快。 我使用val變量作為占位符。 交換完成后,我將swapped設置為true,這樣我們的do / while循環將繼續。

return list;

好吧...返回結果。

我已經排除了一些檢查,例如當列表的長度為0時我們做什么。 基本上,在編寫輔助函數時,我們還需要處理錯誤處理。 例如,當傳遞的比較參數不是函數時引發TypeError,例如,確保比較方法返回布爾值,依此類推。

//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
for (var i = 1; i<input.length; i++)
{
    if(input[i] > input[i-1])
    {
        for(var o = i-1; o>=0; o--)
        {
            if(input[i] > input[o])
            {
                input.splice(i+1,0,input[o]);
                input.splice((o),1);
                i--;
            }       
        }
    }
}
document.write(input);

雖然它仍然不是很好,但它應該可以工作。 請記住,我幾乎沒有對此進行測試,並且對JavaScript缺乏經驗。 您的意圖並不都是壞事,每個人都需要從某個地方開始。

最大的問題僅僅是內部條件。 我可以看到您的邏輯,即從找到的較大值向后循環,然后將所有較小的值向右推。 不幸的是,您的索引有些不足。 您還需要運行此循環,直到它正常結束為止,而不是繼續進行,否則,您將只切換一個值。 固定此條件后,不再需要第二個條件

另一種形式是從最低的索引開始,然后找到小於input [i]的第一個值,然后將其放在那里。 這可能更清楚。

我認為這是一個很好的第一槍,並且開始工作並不難。 祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM