面试总结 - 基础编程 - 排序算法5.js

冒泡排序

冒泡排序就是从数列的第0个数开始对比,若a[i] > a[i+1], 则调换i和i+1的顺序,比较n-1次。最后形成了小的数在前,大的数在后。

  • 时间复杂度为 O(n²)
function bubbleSort(arr) {
  for (let len = 0; len < arr.length - 1; len++) {
    for (let i = len; i > 0; i--) {
      if (arr[i] > arr[i + 1]) {
        [arr[i], arr[i + 1]] = [arr[i + 1], arr[i]]
      }
    }
  }
  // arr = arr.sort(function (x, y) { return x - y})
  return arr
}

// test
let arr = [8, 1, 2, 10, 3, 7, 9, 4, 5, 6];
let sortArr = bubbleSort(arr)
console.log(sortArr, '<=== bubbleSort')
快速排序

快速排序就是从目标数组中取一个标识值出来,将数组中的每一项都与这个值做比较,大的放一边,小的放一边;再将左边和右边的子数组分别再取一个标识出来做比较,以此类推递归,直到子数组长度为1.

Array.prototype.quickSort = function (fn) {
  const isFn = (f) => {
    if (f === undefined) return 0;
    else if (typeof f !== 'function') {
      throw new Error(`fn must be function, but got a ${typeof f}`);
    }
    const compare = f(3, 1);
    return isNaN(compare) ? 0 : (compare > 0 ? 1 : -1);
  };
  const small2big = isFn(fn);

  const quick = (arr) => {
    if (arr.length <= 1) return arr;
    if (!small2big) return arr; // 0: 不排序 1: 升序 -1: 降序

    const mid = Math.floor(arr.length / 2);
    const reference = arr.splice(mid, 1)[0];
    const left = [], right = [];
    arr.forEach((item) => {
      if (small2big > 0) {
        if (item > reference) {
          right.push(item);
        } else {
          left.push(item);
        }
      } else {
        if (item < reference) {
          right.push(item);
        } else {
          left.push(item);
        }
      }
    });
    return quick(left).concat(reference, quick(right));
  };

  return quick(this);
}

const c = [1, 3, 6, 7, 8, 3, 4, 2, 5, 7, 8, 9, 6, 4, 3, 2];
const d = [1, 5, 3, 6, 7];
console.log(c.quickSort(function (a, b) { return b - a; }), '排序后 vs 排序前', c);
console.log(d.quickSort(), '排序后 vs 排序前', d);

精品句子

翻译题目:【士可杀不可辱!】
平常答:You can kill me, but you can not fuck me.
优秀答:A scholar prefers death to humiliation.
我答:Shi ke sha, bu ke ru.


3分钟,了解天下大事

每天花3分钟在【每日全搜索】上,可尽知天下大事。
把省下来的时间留给自我技术沉淀噻~
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值