JS 冒泡排序、快速排序、归并排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_37615202/article/details/88343740

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+ 6+15+21+63

归并排序。二叉树,是因为归并排序同样可以用构成一棵二叉树来解释,只不过快排的复杂度花在了成树(二叉搜索树)上(从上往下),而归并排序的复杂度花在了归并上(从下往上)。

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: ' + 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:' + 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,10、、、、

然后最后的排 然后 over!!!!

猜你喜欢

转载自blog.csdn.net/weixin_37615202/article/details/88343740