概念
冒泡排序的核心思想是通过重复遍历待排序的数列,比较相邻的两个元素,如果它们的顺序错误(例如升序排列时前一个元素大于后一个元素),则交换它们的位置。这样,每一轮遍历都会将当前未排序部分的最大(或最小)元素“冒泡”到数列的末尾。
思路
第一步 先理解冒泡排序【重点】
顾名思义,冒泡排序就是像冒泡泡一样排序,在水塘中气泡是从塘底冒到湖面上的,应用到排序中就是一个元素慢慢的从左边移动到右边,或者从下面移动到上面,注意这个过程是渐进的,不是突然间的移动。在排序中就需要先对比第一个和第二个,然后再对比第二个和第三个以此类推。。。。
第二步 场景假设
符合这个场景的最容易理解的就是对一个数值类型的数组做排序,举个例子你有一个数组
[64, 34, 25, 12, 22, 90, 11]
然后用冒泡排序的思路去对它做排序,此时的思路是把大的值从左到右的移动过去(冒泡)
graph TD
初始数组[64, 34, 25, 12, 22, 90, 11] --> 从左到右对比6次把最大的放在最右侧 --> 得到[34, 25, 12, 22, 64, 11, 90] --> 从左到右再对比5次把第二大的值放在倒数第二个 --> 得[25, 12, 22, 34, 11, 64, 90] --> 以此类推 --> 最终[11, 12, 22, 25, 34, 64, 90]
为了方便理解我把在执行第一次循环时的逻辑放到了下面
- 比较
64和34,因为64 > 34,所以交换它们的位置。数组变为[34, 64, 25, 12, 22, 90, 11]。 - 比较
64和25,因为64 > 25,所以交换它们的位置。数组变为[34, 25, 64, 12, 22, 90, 11]。 - 比较
64和12,因为64 > 12,所以交换它们的位置。数组变为[34, 25, 12, 64, 22, 90, 11]。 - 比较
64和22,因为64 > 22,所以交换它们的位置。数组变为[34, 25, 12, 22, 64, 90, 11]。 - 比较
64和90,因为64 < 90,所以不交换它们的位置。数组保持不变。 - 比较
90和11,因为90 > 11,所以交换它们的位置。数组变为[34, 25, 12, 22, 64, 11, 90]。
第三步 代码实现
function bubbleSort(arr) {
let n = arr.length;
for (let i = 0; i < n; i++) {
for (let j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
}
}
}
return arr;
}
// 测试代码
const arr = [64, 34, 25, 12, 22, 90, 11];
console.log("原数组:", arr);
console.log("排序后:", bubbleSort([...arr]));