传统的冒泡排序是 通过两两排序比较,直到排序完成
// 冒泡排序
//定义数组
var num = [68, 20, 34, 7, 45, 55, 92];
//定义一个变量来存储交换的数据
var tem = 0;
//外层循环:每一趟找到一个最大值
for (var i = 0; i < num.length - 1; i++)
{
//内层循环:比较次数,并且判断两个数的大小,大的后移,小的前移
for (var j = 0; j < num.length - 1 - i; j++)
{
//判断相邻两个数据的大小
if (num[j]>num[j+1])
{
//进行数据交换
tem = num[j];
num[j] = num[j + 1];
num[j + 1] = tem;
}
}
}
//输出数组
console.log(num);
输出结果如下
优化一外层循环:
当我们把外层循环交换前后的数据打印出来时发现 第3趟之后的数据就未进行变化,但循环还在继续
此时我们的优化方案如下
// 冒泡排序
//定义数组
var num = [68, 20, 34, 7, 45, 55, 92];
//定义一个变量来存储交换的数据
var tem = 0;
//外层循环:每一趟找到一个最大值
for (var i = 0; i < num.length - 1; i++)
{
//用来记录是否进行交换
var isChange = false;
//内层循环:比较次数,并且判断两个数的大小,大的后移,小的前移
for (var j = 0; j < num.length - 1 - i; j++)
{
//判断相邻两个数据的大小
if (num[j] > num[j + 1])
{
//进行数据交换
tem = num[j];
num[j] = num[j + 1];
num[j + 1] = tem;
isChange=true;
}
}
if (!isChange)
{
break;
}
//输出数组
console.log("第" + (i + 1)+"遍的最终结果为:"+num);
}
console.log(num)
此时我们发现趟数变少了,外层循环次数减少
优化二内层循环:
但内层循环结果发现 :内层循环数据一致 但内循环还在继续
优化方案如下:
// 冒泡排序
//定义数组
var num = [68, 20, 34, 7, 45, 55, 92];
//定义一个变量来存储交换的数据
var tem = 0;
//用来记录最后一次交换的位置
var tempPostion = 0;
var let = num.length - 1;
//外层循环:每一趟找到一个最大值
for (var i = 0; i < num.length - 1; i++)
{
//用来记录是否进行交换
var isChange = false;
//内层循环:比较次数,并且判断两个数的大小,大的后移,小的前移
for (var j = 0; j < let; j++)
{
//判断相邻两个数据的大小
if (num[j] > num[j + 1])
{
//进行数据交换
tem = num[j];
num[j] = num[j + 1];
num[j + 1] = tem;
isChange = true;
tempPostion = j; //记录交换的位置
}
console.log("第" + (i + 1) + "趟第" + (j + 1) + "次的最终结果为:" + num);
}
let = tempPostion;
if (!isChange)
{
break;
}
//输出数组
console.log("第" + (i + 1) + "遍的最终结果为:" + num + "");
console.log("");
}
console.log(num)
运行结果如下
这样就完成了冒泡排序的优化