冒泡/快排/常见排序

109 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

虽说目前本人实际业务开发中基本遇见手写排序的场景,但是面试造火箭,还是很有可能会被问到的。这里总结一下常见的排序方法:

image-20220324200140758.png

1、冒泡排序

冒泡排序的原理如下:

  1. 从第一个元素开始,把当前元素和下一个索引元素进行比较。如果当前元素大,那么就交换位置,重复操作直到比较到最后一个元素,那么此时最后一个元素就是该数组中最大的数。
  2. 下一轮重复以上操作,但是此时最后一个元素已经是最大数了,所以不需要再比较最后一个元素,只需要比较到 length - 1 的位置。
function bubbleSort(list) {
    let n = list.length;
    if (!n) {
        return []
    }
    // 两层循环
    for(let i=0; i<n; i++) {
    // 外层循环排序整个list
        for(let j=0; j<n-i-1;j++) {
        // 内层循环排序外层循环i前的所有值
            if (list[j] > list[j+1]) {
                [list[j], list[j+1]] = [list[j+1], list[j]]
            }
        }
    }
    return list
}

2、快速排序

快排的原理如下:

  1. 随机选取一个数组中的值作为基准值,从左至右取值与基准值对比大小。
  2. 比基准值小的放数组左边,大的放右边,对比完成后将基准值和第一个比基准值大的值交换位置。
  3. 然后将数组以基准值的位置分为两部分,继续递归以上操作
function quickSort(list) {
    let n = list.length;
    if (n <= 1) return list;
    
    let midIndex = Math.floor(n/2);  // 获取中间index
    let midVal = list[midIndex];    // 获取中间值
    let left = [], right = [];
    for(var i=0; i<n; i++){
        if (i===midIndex) continue;
        if (list[i] < midVal) {
            left.push(list[i]);
        } else {
            right.push(list[i]);
        }
    }
    // 递归排序
    return quickSort(left).concat([midVal], quickSort(right));
}