使用JavaScript学习数据结构和算法(3) | 小册免费学

302 阅读4分钟

系列文章

排序算法

冒泡排序

冒泡排序是排序算法中最简单的,然后从运行角度来看,它却是最差的一个。
冒泡排序的原理很简单,就是比较任何两个相邻的项,如果第一个比第二个大,则交换他们。元素项向上移动至正确的顺序,就好像气泡上升到表面一样,冒泡排序因此得名。

步骤

  • 比较相邻的元素,如果第一个如第二个大,就交换他们两个。
  • 对每一组相邻元素作同样的工作,从开始第一对到结尾的最后一对,这步做完,最后的元素会是最大的数。
  • 针对所有的元素重复以上步骤,直到没有任何一对数字需要比较。

JS 实现

function bubleSort(arr) {
  let len = arr.length;
  for (let outer = len; outer >= 2; outer--) {
    for (let inner = 0; inner <= outer - 1; inner++) {
      if (arr[inner] > arr[inner + 1]) {
        [arr[inner], arr[inner + 1]] = [arr[inner + 1], arr[inner]];
      }
    }
  }
  return arr;
}
let arr = [1, 2, 5, 4, 5, 4, 78, 4];
console.log(bubleSort(arr)); // [1, 2, 4, 4, 4, 5, 5, 78]

bubble.gif

选择排序

选择排序是一种原址比较排序算法,选择排序大致的思路就是找到数据结构中最小的值并将其放在第一次,然后找到第二小的值,将其放在第二位...以此类推

步骤

  • 找到最小的值,和第一个元素交换。
  • 知道第二小的值,和第二个元素交换
  • 以此类推..

selection.gif

插入排序

插入排序的原理如下。第一个元素默认是已排序元素,取出下一个元素和当前元素比较,如果当前元素大就交换位置。那么此时第一个元素就是当前的最小数,所以下次取出操作从第三个元素开始,向前对比,重复之前的操作。

步骤

  • 将第一待排序序列的第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是末排序列。
  • 从头到尾一次扫描未排序序列,将扫描的每个元素插入有序序列的适当位置。

JS 实现

function insertSort(arr) {
  let len = arr.length;
  for (let i = 1; i < len; i++) {
    for (let j = i; j > 0; j--) {
      if (arr[j] < arr[j - 1]) {
        [arr[j], arr[j - 1]] = [arr[j - 1], arr[j]];
      } else {
        break;
      }
    }
  }
  return arr;
}
let arr = [1, 2, 5, 4, 5, 4, 78, 4];
console.log(insertSort(arr)); // [1, 2, 4, 4, 4, 5, 5, 78]

insertion.gif

归并排序

归并排序是一种分而治之算法,其思想是将原数组切割分为较小的数组,知道买个小数组只有一个位置,接着讲小数组归并为大的数组,知道最后只有一个排序完毕的大数组。

步骤

  • 将原始数组分割为多个的只有一个项的小数组
  • 然后将小数组排序
  • 最后将已排好的小数组归并为一个大数组

merge.gif

快速排序

快排的原理如下。随机选取一个数组中的值作为基准值,从左至右取值与基准值对比大小。比基准值小的放数组左边,大的放右边,对比完成后将基准值和第一个比基准值大的值交换位置。然后将数组以基准值的位置分为两部分,继续递归以上操作。

步骤

  • 首先,从数组中选择中间一项作为基准值。
  • 创建两个指针,左边一个指向数组的第一项,右边一个指向数组的最后一项。
    • 移动左指针直到找到一个比基准值大的元素
    • 移动右指针直到找到一个比基准值小的元素
    • 然后交换他们
    • 重复这个过程,直到左指针超过右指针。
  • 这个过程将使得比基准值小的值都排在基准值之前,而比基准值大的值都排在基准值后面,直至数组排序完全。
function quickSort(arr) {
  if (arr.length <= 1) {
    return arr; // 边界
  }
  var left = [];
  var right = [];
  var current = arr.splice(0, 1);
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] < current) {
      left.push(arr[i]); // 放在左边
    } else {
      right.push(arr[i]); // 放在右边
    }
  }
  return quickSort(left).concat(current, quickSort(right)); // 递归
}
let arr = [1, 2, 5, 4, 5, 4, 78, 4];
console.log(quickSort(arr)); // [1, 2, 4, 4, 4, 5, 5, 78]

quick.gif

来自九旬的原创:博客原文链接

本文正在参与「掘金小册免费学啦!」活动, 点击查看活动详情