>[success] # 冒泡排序 ~~~ 1.冒泡排序比较所有相邻的两个项,如果第一个比第二个大,则交换它们。元素项向上移 动至 正确的顺序,就好像气泡升至表面一样,冒泡排序因此得名 2.如图冒泡排序会将排序好的结果至于末尾,是一个从后向前的过程 ~~~ ![](https://box.kancloud.cn/b7d216a5b292cf3a5412bbc7fbb56a9e_826x257.gif) ![](https://img.kancloud.cn/f6/84/f6848d124513bcb18ea7d618bf5b9cc7_1004x958.png) >[info] ## 代码实现 >[danger] ##### 根据纯概念实现 ~~~ // 生成随机数数组 function randomArray(max, min, len) { let randomNum = 0 const array = [] for (let i = 0; i < len; i++) { randomNum = Math.floor((Math.random() * (max - min + 1)) + min) array.push(randomNum) } return array } const array = randomArray(1, 10, 5) // 冒泡排序 const Compare = { LESS_THAN: -1, BIGGER_THAN: 1, EQUALS: 0 }; function defaultCompare(a, b) { if (a === b) { return Compare.EQUALS; } return a < b ? Compare.LESS_THAN : Compare.BIGGER_THAN; } function swap(array, a, b) { /* const temp = array[a]; array[a] = array[b]; array[b] = temp; */ [array[a], array[b]] = [array[b], array[a]]; } function bubbleSort(array, compareFn = defaultCompare) { const { length } = array for (let i = 0; i < length; i++) { for (let j = 0; j < length - 1; j++) { if (compareFn(array[j], array[j + 1]) === Compare.BIGGER_THAN) { swap(array, j, j + 1) } } } } bubbleSort(array) console.log(array) ~~~ >[danger] ##### 优化 ~~~ 1.这里做了一个小改动'length-1-i',因为在概念上已经说了是相邻的进行比较,所以在每一轮的时候对应末尾位置数据 已经排序好了,已经拍好的位置就不用相邻位置进行比较了,因此做了这个改动 2.但无论怎么改动都改变不了冒泡排序速度慢的事实,运行就是O(n2)。 ~~~ ~~~ function bubbleSort(array, compareFn = defaultCompare) { const { length } = array for (let i = 0; i < length - 1; i++) { // 这里做优化 for (let j = 0; j < length - 1 - i; j++) { if (compareFn(array[j], array[j + 1]) === Compare.BIGGER_THAN) { swap(array, j, j + 1) } } } } ~~~