多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 原理 依次比较相邻的两个值,如果后面的比前面的小,则将小的元素排到前面。依照这个规则进行多次并且递减的迭代,直到顺序正确。 # 性能 - 时间复杂度 平均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`,只需要比较数组的第一和第二项,比较完毕,返回。