一、题目描述
对一个非有序数组进行升序的排序。
示例 1:
输入:[5, 8, 6, 3, 4, 7, 1, 2]
输出:[1, 2, 3, 4, 5, 6, 7, 8]
二、思路分析
冒泡排序,顾名思义就和水里的泡泡一样越往上就会越大。
依次比较两个相邻的元素,如果第一个比第二个大,则交换它们。
一轮交换下来后,可以保证最后一个数是最大的。
输入:[5, 8, 6, 3, 4, 7, 1, 2]
// 第一轮
^
[5, 8, 6, 3, 4, 7, 1, 2]
^
[5, 8, 6, 3, 4, 7, 1, 2]
^
[5, 6, 8, 3, 4, 7, 1, 2]
^
[5, 6, 3, 8, 4, 7, 1, 2]
^
[5, 6, 3, 4, 8, 7, 1, 2]
^
[5, 6, 3, 4, 7, 8, 1, 2]
^
[5, 6, 3, 4, 7, 1, 8, 2]
^
[5, 6, 3, 4, 7, 1, 2, 8]
// 第二轮
^
[5, 6, 3, 4, 7, 1, 2, 8]
^
[5, 6, 3, 4, 7, 1, 2, 8]
^
[5, 3, 6, 4, 7, 1, 2, 8]
^
[5, 3, 4, 6, 7, 1, 2, 8]
^
[5, 3, 4, 6, 7, 1, 2, 8]
^
[5, 3, 4, 6, 1, 7, 2, 8]
^
[5, 3, 4, 6, 1, 2, 7, 8]
// 第三轮
^
[5, 3, 4, 6, 1, 2, 7, 8]
^
[3, 5, 4, 6, 1, 2, 7, 8]
^
[3, 4, 5, 6, 1, 2, 7, 8]
^
[3, 4, 5, 6, 1, 2, 7, 8]
^
[3, 4, 5, 1, 6, 2, 7, 8]
^
[3, 4, 5, 1, 2, 6, 7, 8]
// 第四轮
^
[3, 4, 5, 1, 2, 6, 7, 8]
^
[3, 4, 5, 1, 2, 6, 7, 8]
^
[3, 4, 5, 1, 2, 6, 7, 8]
^
[3, 4, 1, 5, 2, 6, 7, 8]
^
[3, 4, 1, 2, 5, 6, 7, 8]
// 第五轮
^
[3, 4, 1, 2, 5, 6, 7, 8]
^
[3, 4, 1, 2, 5, 6, 7, 8]
^
[3, 1, 4, 2, 5, 6, 7, 8]
^
[3, 1, 2, 4, 5, 6, 7, 8]
// 第六轮
^
[3, 1, 2, 4, 5, 6, 7, 8]
^
[1, 3, 2, 4, 5, 6, 7, 8]
^
[1, 2, 3, 4, 5, 6, 7, 8]
// 第七轮
^
[1, 2, 3, 4, 5, 6, 7, 8]
^
[1, 2, 3, 4, 5, 6, 7, 8]
输出:[1, 2, 3, 4, 5, 6, 7, 8]
三、AC 代码
Array.prototype.bubbleSort = function () {
for (let i = 0, l = this.length - 1; i < l; i++) {
for (let j = 0; j < l - i; j++) {
const p1 = this[j]
const p2 = this[j + 1]
if(p1 > p2) {
this[j] = p2
this[j + 1] = p1
}
}
}
}
const arr = [5, 8, 6, 3, 4, 7, 2, 1]
arr.bubbleSort()
console.log(arr) // [ 1, 2, 3, 4, 5, 6, 7, 8 ]
四、总结
冒泡排序实际上就是不断的判断相邻的两个数的大小并且根据情况交换位置。
需要注意的是循环的区间是 arr.length - 1 以及 内循环 arr.length - 1 - i(外循环的次数) 可以减少不必要的循环。
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情