JavaScript实现冒泡排序

53 阅读3分钟

前言

闲的没事,去看了一下冒泡排序,记录一下,有错的地方希望大神能指出来

 /**
     * 冒泡算法  
     * 原理:
     *     1、将数组进行两两对比,将值大的换到右边,对每一个相邻的执行这个操作,一轮下来就会把最大的排到最后
     *     2、将数组进行数组长度-1轮的比较,就会得到有序的数组
     * 核心:就是两两比较,将最大的放到末尾(如果想从大到小排序也可以是反过来)
     * 原始数组 [2, 6, 4, 8, 7, 3, 9]
     * 第一趟
     *2和6比较,2比6小,位置不变 [2, 6, 4, 8, 7, 3, 9]
     *6和4比较,6比4大,位置交换 [2, 4, 6, 8, 7, 3, 9]
     *6和8比较,6比8小,位置不变 [2, 4, 6, 8, 7, 3, 9]
     *8和7比较,8比7大,位置交换 [2, 4, 6, 7, 8, 3, 9]
     *8和3比较,8比3大,位置交换 [2, 4, 6, 7, 3, 8, 9]
     *8和9比较,8比9小,位置不变 [2, 4, 6, 7, 3, 8, 9]
     第一趟完成,比较六次,此时就把最大的沉到了最后,所以第二趟我们就不比较最后一位了
     [2, 4, 6, 7, 3, 8, 9]
     第二趟
     *2和4比较,2比4小,位置不变 [2, 4, 6, 7, 3, 8, 9]
     *4和6比较,4比6小,位置不变 [2, 4, 6, 7, 3, 8, 9]
     *6和7比较,6比7小,位置不变 [2, 4, 6, 7, 3, 8, 9]
     *7和3比较,7比3大,位置交换 [2, 4, 6, 3, 7, 8, 9]
     *7和8比较,7比8小,位置不变 [2, 4, 6, 3, 7, 8, 9]
     第二趟完成,比较五次,此时找到到二大的
     [2, 4, 6, 3, 7, 8, 9]
     第三趟
      *2和4比较,2比4小,位置不变 [2, 4, 6, 3, 7, 8, 9]
      *4和6比较,4比6小,位置不变 [2, 4, 6, 3, 7, 8, 9]
      *6和3比较,6比3大,位置交换 [2, 4, 3, 6, 7, 8, 9]
      *6和7比较,6比7小,位置不变 [2, 4, 3, 6, 7, 8, 9]
      第三趟完成,比较四次,此时找到到三大的
      [2, 4, 3, 6, 7, 8, 9]
      第四趟
      *2和4比较,2比4小,位置不变 [2, 4, 3, 6, 7, 8, 9]
      *4和3比较,4比3大,位置交换 [2, 3, 4, 6, 7, 8, 9]
      *4和6比较,4比6小,位置不变 [2, 3, 4, 6, 7, 8, 9]
       第四趟完成,比较三次,此时找到到四大的
       [2, 3, 4, 6, 7, 8, 9]
       第五趟
      *2和3比较,2比3小,位置不变 [2, 3, 4, 6, 7, 8, 9]
      *3和4比较,3比4小,位置不变 [2, 3, 4, 6, 7, 8, 9]
       第五趟完成,比较两次,此时找到到五大的
       [2, 3, 4, 6, 7, 8, 9]
       第六趟
       *2和3比较,2比3小,位置不变 [2, 3, 4, 6, 7, 8, 9]
       *第六趟结束,全部循环也结束了

     */
    const arr = [2, 6, 4, 8, 7, 3, 9]
    for (let i = 0; i < arr.length-1; i++) {
      console.log(i)
      for (let j = 0; j < arr.length-1 - i; j++) {
        if (arr[j] > arr[j + 1]) {
          const temp = arr[j + 1]
          arr[j + 1] = arr[j]
          arr[j] = temp;
        }
      }
    }

    console.log(arr)

算法改进

从上边的结果可以看到,在第四趟比较完成后数组已经是有序的了,但是我们没有进行检测,所以继续走了第五趟和第六趟,我们进行第五趟的时候都没有进行交换,在这种情况下不应该在进行第六趟去消耗性能,所以我们应该设置一个变量去检测当前是否进行了交换,如果没有,那么此时的数组就是有序的,我们不需要再进行比较了

 let isChange = true;
    const arr = [2, 6, 4, 8, 7, 3, 9]
    for (let i = 0; i < arr.length - 1 && isChange; i++) {
      console.log(i)
      isChange = false;
      for (let j = 0; j < arr.length - 1 - i; j++) {
        if (arr[j] > arr[j + 1]) {
          const temp = arr[j + 1]
          arr[j + 1] = arr[j]
          arr[j] = temp;
          isChange = true
        }
      }
    }