1.概念
冒泡排序是排序算法里面比较简单的一个排序。它重复地走访要排序的数列,一次比较两个数据元素,如果顺序不对则进行交换,并一直重复这样的走访操作,直到没有要交换的数据元素为止。
2. 算法原理
比如我们有如下原始数组:[20,2,6,29,31,9,25,11]
,按照按照冒泡排序的思想,我们要把相邻的元素两两比较,根据大小来交换元素的位置
第一轮:
- 比较20和2,20>5,交换位置
- 比较20和6,20>6,交换位置
- 比较20和29,无需交换
- 比较29和31,无需交换
- 比较31和9,31>9,交换位置
6.比较31和25,31>25,交换位置
7.比较31和11,31>11,交换位置
共进行7次比较。
接下来进行第二轮比较,从2和6开始比较,到最右边的11结束,31已经是有序的,不需要再参与比较。
第二轮结果:
第三轮结果:
第四轮结果:
第五轮结果:
第六轮结果:
第七轮结果:
至此所有的元素都是有序的。
算法代码
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:
我们来看一下下面的这个数组数组:
第一轮冒泡后,结果为:
可以看到后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
}
}