JS经典排序之冒泡排序和快排,入门级手写实现。

26 篇文章 1 订阅

1.虽然前端在实际工作中较少用到算法体系,不过最基本的数组排序还是得知道下,特别是冒泡排序和快速排序,这两种排序也是在面试中高频出现,所以本文就以动画和手写的方式来展示这两种最基本的数组排序算法。

2.话不多说,直接上正菜。

  • 冒泡排序

let arr = [23, 56, 520, 920, 888, 666];

    // 冒泡排序(写法一)
    function mp1(arr) {
      if (arr.length < 2) {
        return arr
      } else {
        for (let i = 0; i < arr.length; i++) {
          for (let j = 0; j < arr.length; j++) {
            if (arr[j] > arr[j + 1]) {
              [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]
            }
          }
        }
        return arr //一定要return出来,不然就是undefined
      }
    }

    console.log(mp1(arr));  //打印 [23, 56, 520, 666, 888, 920]
let arr = [23, 56, 520, 920, 888, 666];

    // 冒泡排序(写法二)
    function mp2(arr) {
      if (arr.length < 2) {
        return arr
      } else {
        for (let i = 0; i < arr.length - 1; i++) {
          for (let j = i + 1; j < arr.length; j++) {
            if (arr[i] > arr[j]) {
              [arr[i], arr[j]] = [arr[j], arr[i]]
            }
          }
        }
        return arr
      }
    }

    console.log(mp2(arr)); //打印 [23, 56, 520, 666, 888, 920]

  • 快排

 

let arr = [23, 56, 520, 920, 888, 666];

    // 快排(写法一)
    function findMid(arr, left, right) {
      let x = arr[left];
      let i = left;
      let j = right;

      while (i < j) {
        //先从前往后找小的,没找的的话一直继续
        while (i < j && arr[j] > x) {
          j--;
        }
        //找到了,将值填入坑里面,a[j]又变成了坑
        if (i < j) {
          arr[i] = arr[j];
        }
        //然后从前往后找大的,没找到继续找。
        while (i < j && arr[i] < x) {
          i++;
        }
        //找到了,将值填入之前的坑里。
        if (i < j) {
          arr[j] = arr[i]
        }
      }
      //将基准值填入坑
      arr[i] = x;
      return i;
    }

    function kp1(arr, left, right) {
      let length = arr.length;
      let start = left || 0;
      let end = right !== undefined ? right : length - 1;
      if (start < end) {
        let index = findMid(arr, start, end)
        kp1(arr, start, index - 1); //调整基准值左边
        kp1(arr, index + 1, end); //调整基准值右边
      }
      return arr;
    }


    console.log(kp1(arr)); //打印 [23, 56, 520, 666, 888, 920]
let arr = [23, 56, 520, 920, 888, 666];

    // 快排(写法二)
    function kp2(arr) {
      if (arr.length <= 1) {
        return arr;
      }
      let leftArr = [];
      let rightArr = [];
      let q = arr[0];

      for (let i = 1; i < arr.length; i++) {
        if (arr[i] > q) {
          rightArr.push(arr[i])
        } else {
          leftArr.push(arr[i])
        }
      }
      return [].concat(kp2(leftArr), [q], kp2(rightArr));
    }


    console.log(kp2(arr)); //打印 [23, 56, 520, 666, 888, 920]

3.以上就是js中出现频率较高的两种数组排序,各提供了两种比较简易的手写方法。若读者想了解更多排序或者算法知识,不烦打开力扣卷起来。做个会算法的页面仔。23333~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值