这是我参与8月更文挑战的第15天,活动详情查看:8月更文挑战
冒泡排序
- 冒泡排序的
核心思想
:比较任何两个相邻的项,如果第一个比第二个大,则交换它们
。 - 因为元素项向上移动至正确的顺序,就好像气泡升至表面一样,所以叫冒泡排序。
实现
- 首先,我们声明len用来存储 待排序数组的长度;
- 接着,开始
外层循环
,从数组的第一项开始迭代至最后一项。它控制了在数组中经过多少轮排序
。(也就是说,数组中的每一项都会经过一轮) - 然后,内循环 从第一位迭代至倒数第二位,内循环实际上进行当前项和下一项的比较。
- 如果比较的这两项顺序不对,则交换它们。 代码如下:
// 定义待排序数组
let array = [1, 4, 5, 2, 3, 10, 8, 7, 6];
// 定义冒泡排序方法
function bubbleSort() {
let len = array.length;
// 记录交换的次数
let count = 0;
for(let i = 0; i < len; i++){
// 内循环至倒数第二位,是因为,外层第一轮循环结束的时候,最后一个元素已经是最大的了,就没必要再参与比较大小了。
for (let j = 0; j < len - 1; j++) {
if(array[j] > array[j + 1]) {
// 交换位置
let temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
count++;
}
}
}
}
上述代码已经实现了一个最基本的不在乎性能的冒泡排序,上述代码运行之后会发现,即使数组的某两位顺序已经是正常的了,但是在后续的比较中,它们还是会一直在进行比较,而这是没有必要的。
改进冒牌排序算法
- 核心思想:从内循环减去外循环已经跑过的轮数,就可以避免内循环中所有不必要的比较。 代码如下所示:
// 其余代码不变
for(let i = 0; i < len; i++) {
for(let j = 0; j < len - 1 - i; j++) {
// 其余代码不变
}
}
写在最后
- 一般实际项目中,不推荐使用 冒泡算法,它的复杂度是 O(n2);