什么是冒泡排序
冒泡排序(Bubble sort)有时被称为下沉排序(sinking sort),是一种简单的排序算法,它反复遍历要排序的列表,比较每对相邻项,如果它们的顺序不对(升序或降序排列),则将它们交换。重复传递列表,直到不需要交换,这表示列表已排序。
实现思路
以升序排列为例,在每一次循环中,从i=0开始,将相邻的第i项与第i+1项作比较,保证较大的那一项在第i+1位,直到本轮循环结束,保证所有循环遍历元素中的最大值在最后一位。而在下一轮循环比较中,因为所有值的最大值已排在最后,所以不必再做比较。
代码实现
(以升序为例)
//需要比较排序的循环次数
for (let i = 0; i < arrays.length - 1 ; i++) {
//当前循环内需要比较的次数(每进入一次循环比较次数减1)
for (int j = 0; j < arrays.length - i - 1; j++) {
//前一位与后一位与前一位比较,如果前一位比后一位大,交换两位的值
if (arrays[j] > arrays[j + 1]) {
const temp = arrays[j];
arrays[j] = arrays[j + 1];
arrays[j + 1] = temp;
}
}
}
时间复杂度:O(n²)
代码优化
优化原因:如果数组长度为10,那么就要进行10轮遍历比较,时间复杂度为O(n²);如果在进行到第五轮比较时就已经没有要交换的值了,即此时已经是排序完成的状态了,此时再进行新一轮的遍历比较是没有意义的,因为在没有叫唤值的时候应该跳出循环,完成排序。
//需要比较排序的循环次数
for (let i = 0; i < arrays.length - 1 ; i++) {
//每一轮中比较之后交换的次数初始化为0
let time = 0
//当前循环内需要比较的次数(每进入一次循环比较次数减1)
for (int j = 0; j < arrays.length - i - 1; j++) {
//前一位与后一位与前一位比较,如果前一位比后一位大,交换两位的值
if (arrays[j] > arrays[j + 1]) {
const temp = arrays[j];
arrays[j] = arrays[j + 1];
arrays[j + 1] = temp;
//但凡本轮中有比较之后的值交换即将time值改变
time = 1
}
}
//如果time值不为0,跳出循环
if(time !== 0) break
}
时间复杂度:O(n*m)(m<=0)