十大排序算法(JavaScript实现 )- 冒泡排序 Bubble Sort

325 阅读3分钟
  1. 十大排序算法(JavaScript实现 )- 冒泡排序 Bubble Sort

  2. 十大排序算法(JavaScript实现 )- 选择排序 Selection Sort

  3. 十大排序算法(JavaScript实现 )- 插入排序 Insertion Sort

  4. 十大排序算法(JavaScript实现 )- 希尔排序 Shell Sort

  5. 十大排序算法(JavaScript实现 )- 快速排序 Quick Sort

  6. 十大排序算法(JavaScript实现 )- 归并排序  Merge Sort

  7. 十大排序算法(JavaScript实现 )- 计数排序 Count Sort

  8. 十大排序算法(JavaScript实现 )- 桶排序 Bucket Sort

  9. 十大排序算法(JavaScript实现 )- 基数排序 Radix Sort

  10. 十大排序算法(JavaScript实现 )- 堆排序 Heap Sort

1.概念

冒泡排序是排序算法里面比较简单的一个排序。它重复地走访要排序的数列,一次比较两个数据元素,如果顺序不对则进行交换,并一直重复这样的走访操作,直到没有要交换的数据元素为止。

2. 算法原理

比如我们有如下原始数组:[20,2,6,29,31,9,25,11],按照按照冒泡排序的思想,我们要把相邻的元素两两比较,根据大小来交换元素的位置

图片.png

第一轮:

  1. 比较20和2,20>5,交换位置

图片.png

  1. 比较20和6,20>6,交换位置

图片.png

  1. 比较20和29,无需交换
  2. 比较29和31,无需交换
  3. 比较31和9,31>9,交换位置

图片.png

6.比较31和25,31>25,交换位置

图片.png

7.比较31和11,31>11,交换位置

图片.png

共进行7次比较。

接下来进行第二轮比较,从2和6开始比较,到最右边的11结束,31已经是有序的,不需要再参与比较。

第二轮结果: 图片.png
第三轮结果: 图片.png
第四轮结果: 图片.png
第五轮结果: 图片.png
第六轮结果: 图片.png
第七轮结果:

图片.png
至此所有的元素都是有序的。

算法代码

function bubbleSort(arr) {
  const len = arr.length
  for (let i = 0; i < len - 1; i++) {
    for (let j = 0; j < len - i- 1;j++) {
      if (arr[j] > arr[j+1]) {
        const temp = arr[j]
        arr[j] = arr[j+1]
        arr[j+1] = temp
      }
    }
  }
}

算法优化1

从上面的图中,我们发现,第四轮后数组已经是有序了,但程序还是进行了第五轮、第六轮、第七轮的排序。可以在排序时做个标记,如果数组已经有序了,就不再进行后续的排序。
优化后代码如下:

function bubbleSort(arr) {
  const len = arr.length
  for (let i = 0; i < len - 1; i++) {
    // 标识是否有序
    let flag = true
    for (let j = 0; j < len - i- 1;j++) {
      if (arr[j] > arr[j+1]) {
        const temp = arr[j]
        arr[j] = arr[j+1]
        arr[j+1] = temp
        // 需要交换,说明还是无序的
        flag = false
      }
    }
    if (flag) break
  }
}

算法优化2:

我们来看一下下面的这个数组数组:

图片.png 第一轮冒泡后,结果为:

图片.png

可以看到后4位元素已经是有序了,但还是进行了比较,并且在第二轮,第三轮还会对后面有序的元素进行比较。可以通过记录每轮交换后,最后一次交换的位置,进行优化。

function bubbleSort(arr) {
  const len = arr.length
  let lastSwopIndex = 0
  let sortBorder = len - 1
  for (let i = 0; i < len - 1; i++) {
    // 标识是否有序
    let flag = true
    for (let j = 0; j < sortBorder ;j++) {
      if (arr[j] > arr[j+1]) {
        const temp = arr[j]
        arr[j] = arr[j+1]
        arr[j+1] = temp
        // 需要交换,说明还是无序的
        flag = false
        lastSwopIndex = j
      }
    }
    sortBorder = lastSwopIndex
    if (flag) break
  }
}