天天看點

JavaScript快速排序(遞歸二分排序)(分治算法)

function quickSort(arr){
    //找到最後一層的傳回條件
    if(arr.length <= 1){   
        return arr;
    }
    //截取數組中間位置的值
    var center = arr.splice( parseInt(arr.length / 2), 1)[0];
    //定義小于和大于中間位置值的數組  
    var left = [], right = [];

    //周遊截取後的數組并将小于和大于center的值分别放到left和right中
    for(var i = 0; i < arr.length; i++){
        if(arr[i] <= center){
            left.push(arr[i]);
        }
        else{
            right.push(arr[i]);
        }
    }
    // 使用遞歸對于left和right繼續進行排序
    // 對于倒數第二次遞歸來說,left和right數組中可能隻有0-1個值,
    // 倒數第一次進入這個函數的時候,就會被判斷為length<=1,到達遞歸終點
    // 這時候向上歸,對于傳回的數組進行concat合并,
    // 注意:concat傳回值是一個新數組,不是對原數組操作
    return quickSort(left).concat(center, quickSort(right));
}
console.log(quickSort(arr));