经典排序算法的JS实现

1.冒泡排序法, 算法可视化实现参考visualgo,空间复杂度

Tips:因比较少一个数组,所以循环次数要小于length-1

复杂度:O(n²)

function bubble(a) {
  for (let i = 0; i < a.length - 1; i++) {
    for (let j = 0; j < a.length - i - 1; j++) {
      if (a[j] > a[j + 1]) {
        [a[j], a[j + 1]] = [a[j + 1], a[j]]
      }
    }
  }
 return [...a]
}

2.快速排序算法,算法可视化实现参考visualgo

Tips:考察递归,中分查找法

复杂度:O(nlogn)

function quick(a) {
  if (a.length <= 1) return a;
  let lArr = [], rArr = [];
  let q = a[0]
  //切记从1开始
  for (let i = 1; i < a.length; i++) {
    if (a[i] < q) lArr.push(a[i])
    else rArr.push(a[i])
  }
  //开始递归调用
  return [...quick(lArr), q, ...quick(rArr)]
}

3.归并排序算法,时间复杂度:O(n log n)

是一种分治法的思想

function mergeSort(list) {
  let length = list.length;
  if (length == 1) { // 递归结束条件
    return list;
  }
  let mid = Math.floor(length / 2);
  let left = list.slice(0, mid);
  let right = list.slice(mid, length);
  return merge(mergeSort(left), mergeSort(right));// 递归,跟快速排序差不多一样
};

function merge(left, right) {
  let result = [];
  let nl = 0;
  let nr = 0;
  while (nl < left.length && nr < right.length) {
    if (left[nl] < right[nr]) {
      result.push(left[nl++]);
    } else {
      result.push(right[nr++]);
    }

  }
  while (nl < left.length) {
    result.push(left[nl++]);

  }
  while (nr < right.length) {
    result.push(right[nr++]);

  }

  return result;
}

 

posted @ 2019-07-19 20:56  Bruce_Grace  阅读(281)  评论(0编辑  收藏  举报