面试中常见的排序算法

过年正好有空,总结了下面试中常见的排序算法。方便以后回忆。

/**
 * 记忆点:双for循环,次数,对数
 * 步骤:
 *      1.从第一个元素开始,和相邻的元素进行比较,比较len-1次即可。
 *      2.每次比较len-i-1对元素即可。
 */
function bubbleSort(arr) {
    let len = arr.length, temp;
    // 比较的次数
    for (let i = 0; i < len - 1; i++) {
        // 每次比较的对数
        for (let x = 0; x < len - i - 1; x++) {
            if (arr[x] > arr[x + 1]) {
                temp = arr[x + 1];
                arr[x + 1] = arr[x];
                arr[x] = temp;
            }
        }
    }
    return arr
}

/**
 * 记忆点:双for循环,最小值
 * 步骤:
 *      1.把当前第i个元素设为最小值,保存在min变量中,并且保存其下标到index变量中。i=0;
 *      2.用该值和剩余元素进行比较,剩余元素比min小时,重置min,index的值。x=i+1;
 *      3.第一个元素值和min值所在元素进行对换。
 */
function selectSort(arr) {
    let len = arr.length, min, index, temp;
    for (let i = 0; i < len; i++) {
        min = arr[i];
        index = i;
        for (let x = i + 1; x < len; x++) {
            if (arr[x] < min) {
                min = arr[x];
                index = x;
            }
        }
        temp = arr[i];
        arr[i] = min;
        arr[index] = temp
    }
    return arr
}

/**
 * 记忆点:双for循环,扑克
 * 步骤:
 *      1.设第i个元素为无序元素,i=1。x个元素为有序元素,x=i-1。
 *      2.无序元素和有序元素进行比较,当该元素小于有序元素大时,有序元素往左移。arr[x+1] = arr[x] 让位。
 *      3.将无序元素插入有序序列中合适的位置。
 */
function insertSort(arr) {
    let len = arr.length, key, x;
    for (let i = 1; i < len; i++) {
        key = arr[i];
        x = i - 1;
        while (x >= 0 && arr[x] > key) {
            arr[x + 1] = arr[x];
            x--;
        }
        x++;
        arr[x] = key;
    }
    return arr;
}

/**
 * 记忆点:切割,合并,二分法,递归
 * 步骤:
 *      1.第一个函数进行分割,第二个函数进行合并。
 */
function mergeSort(arr) {
    // 切割
    function slice(arr_) {
        if (arr_.length < 2) {
            return arr_
        }
        let mid = Math.floor(arr_.length / 2),
            lef = arr_.slice(0, mid),
            rig = arr_.slice(mid);
        return merge(slice(lef), slice(rig));
    }

    // 合并
    function merge(lef_, rig_) {
        let res = [];
        while (lef_.length && rig_.length) {
            lef_[0] <= rig_[0] ? res.push(lef_.shift()) : res.push(rig_.shift())
        }
        if (lef_.length) res.push(...lef_);
        if (rig_.length) res.push(...rig_);
        return res;
    }

    return slice(arr)
}

/**
 * 记忆点:基数,二分法,递归
 * 步骤:
 *      1.取数组的第一个元素作为基数,剩余值进行比较。i=1
 */
function quickSort(arr) {
    if (arr.length === 0) {
        return []
    }
    let key = arr[0],
        lef = [],
        rig = [];
    for(let i = 1; i < arr.length; i++) {
        if (arr[i] <= key) {
            lef.push(arr[i])
        } else {
            rig.push(arr[i])
        }
    }
    return quickSort(lef).concat(key, quickSort(rig))
}

// console.log(xxxSort([4, 3, 2, 1]));复制代码

参考:

https://www.jianshu.com/p/8d30da8b832e

https://github.com/hustcc/JS-Sorting-Algorithm



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值