Featured image of post 冒泡排序与快排以及算法的时间复杂度

冒泡排序与快排以及算法的时间复杂度

简单的排序总是要会的嘛

推荐一个很好的 APP - 算法动画图解,以下解法都是参考该 APP 实现

冒泡排序

我不太好把 APP 的动画贴上来,大家可以自己搜索一下,但是主要的思想就是,从数组末位开始,依次和上一位两两比较,将较小的数交换到左边,那么第一轮下来之后,最左侧就是该数组最小的值,接下来重复之前的动作,将第二小的数字排在左侧倒数第二个,重复数组长度的次数之后即完成排序,下面是我的实现:

// 定义一个工具函数,用于交换数组中两个位置的值
function exchange(list, index1, index2) {
  [list[index1], list[index2]] = [list[index2], list[index1]];
}

function bubbleSort(list) {
  let position = 0;

  const len = list.length;

  while (position < len) {
    for (let i = len - 1; i > position; i--) {
      if (list[i] < list[i - 1]) {
        exchange(list, i, i - 1);
      }
    }

    position++;
  }

  return list;
}

快速排序

顾名思义,该排序的特点就是快,主要思想就是从原始数组中取一个基准值,然后比此值大的都放到右边,小的都放左边,然后取基准值左边的和右边的各为新数组,重复之前的步骤,也就是一种递归,最后直至左侧、右侧都只有一个元素或者 0 个元素,我的实现如下:

function quickSort(list) {
  const len = list.length;

  if (len < 2) return list;

  const left = [];
  const right = [];
  const basic = list[0];

  list
    .slice(1)
    .forEach((item) => (item >= basic ? right.push(item) : left.push(item)));

  return quickSort(left).concat(basic, quickSort(right));
}

算法时间复杂度

算法有好有坏,那么我们怎么衡量算法的好怀呢?这里就引入了时间复杂度的概念,比如上边的冒泡排序的时间复杂度为 O(n^2),而快排的时间复杂度则为 O(n*Logn),那么这个复杂度到底是如何得来的,我在知乎上边找到一篇回答讲的很好

Licensed under CC BY-NC-SA 4.0