# 原理
依次比較相鄰的兩個值,如果后面的比前面的小,則將小的元素排到前面。依照這個規則進行多次并且遞減的迭代,直到順序正確。
# 性能
- 時間復雜度
平均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`,只需要比較數組的第一和第二項,比較完畢,返回。