JS 冒泡排序、快速排序、歸併排序

JS面試題必考題

冒泡排序: 隨便從數組中拿一位數和後一位數比較,若是是想從小排到大排序,那麼就把小的那一位放到前面,大的放到後面,簡單來講就是交換他們的位置,如此反覆的交換位置就能夠獲得排序的效果。面試

var arr = [3,1,4,2,5,21,6,15,63];

function sortA(arr){
    for(var i=0;i<arr.length-1;i++){
        for(var j=i+1;j<arr.length;j++){
                      //獲取第一個值和後一個值比較
            var cur = arr[i];
            if(cur>arr[j]){
                      // 由於須要交換值,因此會把後一個值替換,咱們要先保存下來
                var index = arr[j];
                        // 交換值
                arr[j] = cur;
                arr[i] = index;
            }
        }
    }
    return arr;
}
//由於一次循環只能交換一個最大的值,因此須要再套一層for循環。
複製代碼

快速排序:從數組的中間那一個值,而後經過這個值挨個和數組裏面的值進行比較,若是大於的放一邊,小於的放一邊,而後把這些合併,再進行比較,如此反覆便可數組

var arr = [3, 1, 4, 2, 5, 21, 6, 15, 63];
function sortA(arr) {
    // 若是隻有一位,就沒有必要比較
    if (arr.length <= 1) {
        return arr;
    }
    // 獲取中間值的索引
    var len = Math.floor(arr.length / 2);
    // 截取中間值
    var cur = arr.splice(len, 1);
    console.log('middle data' + cur);
    // 小於中間值放這裏面
    var left = [];
    // 大於的放着裏面
    var right =  [];
    for (var i =  0; i < arr.length; i++) {
        // 判斷是否大於
        if (cur > arr[i]) {
            left.push(arr[i]);
            console.log('left: '+  left);
        } else {
            right.push(arr[i]);
            console.log('right: ' + right);
        }
    }
    // 經過遞歸,上一輪比較好的數組合並,而且再次進行比較。
    return sortA(left).concat(cur, sortA(right));
}
console.log(sortA(arr));
複製代碼
看一下控制檯的打印就能夠看清楚了

合併的順序是    2+3-> 1+2+3  -> 1+2 +3+4 

                         21+63 -> 6 + 15 + 21 + 36

                        最後將left 最外層cur  right 合併  1+2+3+4  +5+&emsp;6+15+21+63
複製代碼

歸併排序。二叉樹,是由於歸併排序一樣能夠用構成一棵二叉樹來解釋,只不過快排的複雜度花在了成樹(二叉搜索樹)上(從上往下),而歸併排序的複雜度花在了歸併上(從下往上)。bash

function mergeSort(arr) {
    // 設置終止的條件,
    if (arr.length < 2) {
        return arr;
    }
    //設立中間值
    var middle = parseInt(arr.length / 2);
    //第1個和middle個之間爲左子列
    var left = arr.slice(0, middle);
    console.log('left: ' +&emsp;left);
    //第middle+1到最後爲右子列
    var right = arr.slice(middle);
    console.log('right: ' + right);
    if (left == "undefined" && right == "undefined") {
        return false;
    }
    return merge(mergeSort(left), mergeSort(right));
}
複製代碼
function merge(left, right) {
    var result = [];
    while (left.length && right.length) {
        if (left[0] <= right[0]) {
            //把left的左子樹推出一個,而後push進result數組裏
            result.push(left.shift());
        } else {
            //把right的右子樹推出一個,而後push進result數組裏
            result.push(right.shift());
        }
    }
    //通過上面一次循環,只能左子列或右子列一個不爲空,或者都爲空
    while (left.length) {
        result.push(left.shift());
    }
    while (right.length) {
        result.push(right.shift());
    }
    console.log('result:' +&emsp;result);
    return result;
}
複製代碼
// 測試數據
    var nums = [6, 10, 1, 9, 4, 8, 2, 7, 3, 5];
    console.log(mergeSort(nums));
複製代碼

首先left 6,10,1,9,4 right:8,2,7,3,5
    
    分到最底層時開始比:9,4 --> 4,9    而後 left 1 right 9,4 排成 1,4,9  而後 left 6,10   right 1,4,9 排成 1,4,6,9,十、、、、
    
    而後最後的排 而後 over!!!!複製代碼
相關文章
相關標籤/搜索