概述
实现原理
简单来说就是实现的思想
- 冒泡排序只会操作相邻的两个数据
- 每次冒泡操作都会对相邻两个元素进行比较,看是否满足大小关系要求。如果不满足就让他俩互换
- 一次冒泡会让至少一个元素移动到它应该再度位置,重复 n 次,就完成了 n 个数据的排序工作
特点
- 优点:排序算法的基础,简单使用易于理解
- 缺点:比较次数多,效率较低
实现
//冒泡排序(未优化)
const buddleSort = arr=>{
let length = arr.length
if ( length <=1 ) return
// i < length - 1 是因为外层只需要 length-1 次就排好了,第 length 次比较是多余的。
for ( let i=0; i<length-1; i++ ){
// j < length - i - 1 是因为内层的 length-i-1 到 length-1 的位置已经排好了,不需要再比较一次。
for (let j=0; j<length-i-1; j++){
if (arr[j] > arr[j+1] ){
const temp = arr[j]
arr[j] = arr[j+1]
arr[j+1] = temp
}
}
}
}
突然发现自己好菜,这个代码乍一看没看懂。
上面代码实现方法是这样的(懂得直接跳过这段),数组两两对比会把大的那个往后排,这样第一次循环之后,数组中最大的会排到最后。所以内层循环for (let j=0; j<length-i-1; j++){ }
,在下一次循环时就可以少循环一次,以此类推,外层循环一次内层循环就少一个。这样每次外层循环对应内场循环就是length-i-1
次。
优化:当某次冒泡操作已经没有数据交换时,说明已经到达完全有序,也就是已经排序完成,不用再继续执行后续的冒泡操作。
// 冒泡排序(已优化)
buddleSort = arr=>{
let length = arr.length
if ( length <=1 ) return
// i < length - 1 是因为外层只需要 length-1 次就排好了,第 length 次比较是多余的。
for ( let i=0; i<length-1; i++ ){
let hasChange = false //标志代表是否某次排序数据没有交换,也就是代表排序已完成
// j < length - i - 1 是因为内层的 length-i-1 到 length-1 的位置已经排好了,不需要再比较一次。
for (let j=0; j<length-i-1; j++){
if (arr[j] > arr[j+1] ){
const temp = arr[j]
arr[j] = arr[j+1]
arr[j+1] = temp
hasChange = true //这个时候是有数据交换的
}
}
if(!hasChange) break // 如果false 说明内层循环在某次数据对比时没有进行数据交换过,这个时候就可以提前退出循环,排序已经完成
}
}
以上就是冒泡排序的实现方法。
最后
以上就是忧虑饼干为你收集整理的JavaScript 数据结构与算法十大经典排序算法-冒泡排序(一)的全部内容,希望文章能够帮你解决JavaScript 数据结构与算法十大经典排序算法-冒泡排序(一)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复