用js实现三种简单排序算法

610 阅读5分钟

在b站看王红元老师的js算法教程后的笔记。

第一次写博客,写的不好、让您不明白的地方,还请见谅,并请移步b站观看详细教程。

b站搜索关键字后,有许多一样的教程,不知道哪个是官方的,就不放链接了。

冒泡排序

简单的说:就是循环比较相邻两元素的的大小,大的放后面,小的放前面。这样多次循环后就完成了排序。

详细说明:如果数组的第一个元素最大,怎么让他到最后最后一位呢。让它循环的与后一位的元素进行比较,如果比后一位大就换交换位置。因为它是最大的所以会一直交换位置到最后一位。这就确定了一个元素的位置。其他的每个元素也是这样,与后一个元素进行比较,大的放到后面,这样每比较一趟就能确定了一个元素的位置 排序 - 冒泡排序.gif

    let bubbleSort = function (array) {
      for (let i = 0; i < array.length - 1; i++) {
        for (let j = 0; j < array.length - i - 1; j++) {
          if (array[j] > array[j + 1]) {
            let item = array[j]
            array[j] = array[j + 1]
            array[j + 1] = item
          }
        }
      }
      return array
    }
    let array = [66, 88, 12, 87, 100, 5, 566, 23]
    console.log(array) // [66, 88, 12, 87, 100, 5, 566, 23]
    console.log(bubbleSort(array)) //  [5, 12, 23, 66, 87, 88, 100, 566]

上面冒泡排序的代码您看懂了吗。如果您看懂了,感谢您的理解能力。 没有也没关系,请看下面的详细说明。

    // 函数的参数是一个数组
    let bubbleSort = function (array) {
      // 第一层循环控制比较的趟数。每趟确定一个元素的位置(如果是5个元素,要比较4趟)
      for (let i = 0; i < array.length - 1; i++) {
        // 第二层循环控制每趟比较的次数。(如果是5个元素,第一趟比较4次,第二趟比较3次)
        for (let j = 0; j < array.length - i - 1; j++) {
          // 如果 某一个元素比 其后一位大。就让他们交换位置
          if (array[j] > array[j + 1]) {
            let item = array[j]
            array[j] = array[j + 1]
            array[j + 1] = item
          }
        }
      }
      return array // 返回 排序后的数组
    }
    let array = [66, 88, 12, 87, 100, 5, 566, 23]
    console.log(array) // [66, 88, 12, 87, 100, 5, 566, 23]
    console.log(bubbleSort(array)) //  [5, 12, 23, 66, 87, 88, 100, 566]

选择排序

简单的说:就是循环找出最小的元素与前面的元素交换位置。这样多次循环后就完成了排序。

详细说明:声明一个变量number,先存储第一个元素的下标。循环遍历数组让每一元素与number元素比较。将较小元素的下标赋值给number。循环一次后number存储的就是最小元素的下标了。让number元素与第一个元素交换,这样就把最小元素放到最前面了。后面从第二个元素开始查找最小元素,找到后与第二个元素交换位置。以此类推。

    let selectionSort = function (array) {
        for (let i = 0; i < array.length - 1; i++) {
          let number = i
          for (let j = i + 1; j < array.length; j++) {
            if (array[number] > array[j]) {
              number = j
            }
          }
          if (array[i] > array[number]) {
            let item = array[i]
            array[i] = array[number]
            array[number] = item
          }
        }
        return array
      }
    let array = [66, 88, 12, 87, 100, 5, 566, 23]
    console.log(array) // [66, 88, 12, 87, 100, 5, 566, 23]
    console.log(selectionSort(array)) //  [5, 12, 23, 66, 87, 88, 100, 566]

上面的代码您看懂了吗。如果您看懂了,感谢您的理解能力。 没有也没关系,请看下面的详细说明。

    let selectionSort = function (array) {
      // 第一层循环控制 要确定的是那个位置元素(第一次要确定第一个位置的元素)
        for (let i = 0; i < array.length - 1; i++) {
          // 先存储当前位置,后面存储 找到的最小元素
          let number = i
          // 第二层循环查找 最小的元素(从i的后一位开始)
          for (let j = i + 1; j < array.length; j++) {
            // 如果 后面有比它小的元素
            if (array[number] > array[j]) {
              // 存储 找到的最小元素
              number = j
            }
          }
          // 交换 元素位置 (有可能第二层循环没找到最小元素 i == number。就不用交换)
          if (array[i] > array[number]) {
            let item = array[i]
            array[i] = array[number]
            array[number] = item
          }
        }
        return array
      }
    let array = [66, 88, 12, 87, 100, 5, 566, 23]
    console.log(array) // [66, 88, 12, 87, 100, 5, 566, 23]
    console.log(selectionSort(array)) //  [5, 12, 23, 66, 87, 88, 100, 566]

插入排序

先说一个概念局部有序:就是数组中从第一个元素开始有一部分元素是有序的。如:这个数组[4, 5, 7, 2, 9, 1]中的4, 5, 7元素,后面的2不是。或者,这个数组[7, 5, 4, 2, 9, 1]中的 7 元素(一个元素也能看成是有序的)。

简单的说:取出局部有序外的一个元素,与局部有序内的元素比较,找到一个合适的位置,然后插入。

详细说明:以这个数组为例[7, 5, 4, 2, 9, 1],先把7元素看成局部有序,取出局部有序外的一个元素5,与7进行比较。7比较大,就向右平移到5的位置上,把5插入到原来7的位置。数组变成了这样[5, 7, 4, 2, 9, 1]5, 7是局部有序的了。后面的元素循环上面的操作。

排序 - 插入排序.gif

    let bubbleSort = function (array) {
      for (let i = 0; i < array.length - 1; i++) {
        for (let j = 0; j < array.length - i - 1; j++) {
          if (array[j] > array[j + 1]) {
            let item = array[j]
            array[j] = array[j + 1]
            array[j + 1] = item
          }
        }
      }
      return array
    }
    let array = [66, 88, 12, 87, 100, 5, 566, 23]
    console.log(array) // [66, 88, 12, 87, 100, 5, 566, 23]
    console.log(bubbleSort(array)) //  [5, 12, 23, 66, 87, 88, 100, 566]

上面的代码您看懂了吗。如果您看懂了,感谢您的理解能力。 没有也没关系,请看下面的详细说明。

let insertionSort = function (array) {
      // 第一层循环查找 局部有序外的元素 (先把第一个元素看成局部有序,从第二个元素开始查找)
      for (let i = 1; i < array.length; i++) {
        // 取出 局部有序外的第一个元素 赋值给变量 temp
        let temp = array[i]
        // 用变量 j 存储 空位置的下标
        let j = i
        // 第二层循环查找 temp元素要插入局部有序内的位置
        while (array[j - 1] > temp && j > 0) {
          // 局部有序内比temp大的元素向右移 (为该元素留位置)
          array[j] = array[j - 1]
          // 空位置的下标-1
          j--
        }
        // 将该元素放在 留出的空位中
        array[j] = temp 
      }
      return array
    }
    let array = [66, 88, 12, 87, 100, 5, 566, 23]
    console.log(array) // [66, 88, 12, 87, 100, 5, 566, 23]
    console.log(insertionSort(array)) //  [5, 12, 23, 66, 87, 88, 100, 566]

谢谢观看。