闲叙
以前在学校的时候学过冒泡排序,可是工作后却再也没有用到过,遇到排序的问题,都是使用数组的一些方法来实现,久而久之就忘得差不多了,但是,这并不是说这个排序就没有存在的意义了,其实在工作中有很多地方都会用到排序,排序方法多种多样,而每种方法都牵扯到不同的算法,不同的算法又有不同的复杂度,又有算法的稳定性需要考量,总之学习并掌握一些算法的思想和实现,对自己的编程水平总是有提升的,即使眼下用不到,但时间久了你会发现一些高级的名词,一些框架中的核心概念中都会有这些算法和设计模式的身影,正因如此,算法才在面试中频频出现。
今天来写下相对来说比较简单的冒泡排序吧
冒泡排序规则: 所谓冒泡排序,即:当我们对数组进行排序时,无论是降序还是升序,都是拿相邻的两个值来做比较,如果前面一个元素比后面一个元素大(升序)或小(降序)就交换它们的位置,这样第一轮下来能够得到最大或者最小的值,第二轮能得到第二大或者第二小的值...从而实现一个有顺序的序列;
排序过程
原数组 [4,3,2,1];
这里以升序为例:
排序次数 排序结果
- 第一次 3,2,1,4 通过arr.length-1-i 次找出本轮最大值
- 第二次 2,3,1,4 同上
- 第三次 2,1,3,4
- 第四次 1,2,3,4
由上可以看出:
我们一共经过四轮(数组length-1)比较完成了这次的排序任务
而每轮比较中,又比较了arr.length-1-i次确定本轮的最大值,减去i是减去上一轮已经确定好的元素的位置
代码如下:
function bubbleSort(){
let arr = [1,3,2,4,7];
let temp;
//首先明白冒泡排序的过程是怎样的找出规律
//一共比较arr.length-1次,每次比较arr.length-1-i次
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]){
//swap
temp = arr[j];
arr[j]=arr[j+1];
arr[j+1] = temp;
}
}
}
console.log(arr,'arr----')
}