冒泡排序(Bubble Sort)
今天在某贴子上看到一个问题,如何使用动画的形式描述冒泡排序,下面的答案有点让人模棱两可,大多数都是文字描述思路,光有思路不够,作为程序员还要动手写出来才可以。冒泡排序虽然是一种基础简单的排序,但是对于刚入门的小伙伴来说也需要一点点理解,为了帮助大家理解冒泡排序,特意写了一遍关于冒泡排序文章,并详细解答其中每一步的意义,供大家参考。
一、什么是冒泡排序
1.1定义
冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
1.2 思路
比较相邻元素,如果前一个比后一个大或者小,就交换他们两个,下面我们都按照升序来说,也就是前一个比后一个大的情况
对每一个相邻元素都做出同样的比较操作,从开始到结尾,一轮排序过后,队尾的一定是队列里最大的元素
针对所有的元素重复做以上操作,除了最后一个,因为最后一个没有和他比较的一对了
重复上面的1、2、3一直到排序完成
1.3 代码
function bubbleSort(arr) {
for(let i = 0; i < arr.length - 1; i++) {
for(let j = 0; j < arr.length - 1 - i; j++) {
if(arr[j] > arr[j+1]) {
[arr[j], arr[j+1]] = [arr[j+1], arr[j]]
}
}
}
return arr
}
const arr = [1,2,5,2,3,6,3]
console.log(bubbleSort(arr)) // [1, 2, 2, 3, 3, 5, 6]
1.4 解析
上面的代码可能有的小伙伴没看明白,比较抽象,下面我来解答一下为什么这样写
1. 为什么外层是arr.length - 1
答:这是一种优化手段,因为最后一次只有一个数字,不需要比较,例如
升序排序 [4,1,3,5, 2]
第一轮
[4,1,3,5,2] => [1,4,3,5,2] => [1,3,4,5,2] => [1,3,4,5,2] => [1,3,4,2,5]
第二轮 最后一项已经冒泡排好了,因此内部排序不用管最后一项了
[1,3,4,2] => [1,3,4,2] => [1,3,4,2] => [1,3,2,4]
第三轮
[1,3,2] => [1,3,2] => [1,2,3]
第四轮
[1,2] => [1,2]
第五轮 // 这就是