# 原理
依次比较相邻的两个值,如果后面的比前面的小,则将小的元素排到前面。依照这个规则进行多次并且递减的迭代,直到顺序正确。
# 性能
- 时间复杂度
平均O(n*n)
最好情况O(n)
最差情况O(n*n)
- 空间复杂度
O(1)
- 稳定性
稳定
# 示例
```
let array = ['E', 'A', 'D', 'B', 'H']
let bubbleSort = (array) => {
for (let i = 0, length = array.length; i <= length; i++) {
for (let j = 0; j <= length - i; j++) {
if (array[j] > array[j + 1]) {
[array[j], array[j + 1]] = [array[j + 1], array[j]]
}
}
}
return array
}
console.log(bubbleSort(array))
```
# 解析
两个循环
当`i = 0`的时候,里面的循环完整执行,从`j = 0`执行到`j = 4`,这也就是第一遍排序,结果是将最大的数排到了最后,这一遍循环结束后的结果应该是`[ 'A', 'D', 'B','E','H']`
当`i = 1`的时候,里面的循环再次完整执行,由于最大的数已经在最后了,没有必要去比较数组的最后两项,这也是`j <= length - 1`的巧妙之处,结果是`[ 'A', 'B', 'D', 'E', 'H' ]`
说到这里,规律就清楚了,每次将剩下数组里面最大的一个数排到最后面,当第一个循环执行到最后的时候,也就是`i = 4`,此时`j = 0`,只需要比较数组的第一和第二项,比较完毕,返回。