1、算法描述
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 [1]
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
2、实现从小到大排序,即大的先冒泡
2.1 待排序数组
const dataArr = [6, 5, 3, 4, 2, 1];
2.2 实现算法描述的前两步
function bubbleSort1(arr) {
//拷贝数组
const newArr = [...arr];
//统计执行次数
let time = 0;
for (let j = 0; j < newArr.length; j++) {
//执行次数加1
time = time + 1;
//临时用来保存需要交换的值
let temp;
//如果前者大于后者,则进行数据交换
if (newArr[j] > newArr[j + 1]) {
temp = newArr[j];
newArr[j] = newArr[j + 1];
newArr[j + 1] = temp;
}
}
console.log("执行次数:", time);
return newArr;
}
console.log(bubbleSort1(dataArr));
执行次数: 6
(6)[5, 3, 4, 2, 1, 6]
2.3 实现第3步
function bubbleSort2(arr) {
//拷贝数组
const newArr = [...arr];
//统计执行次数
let time = 0;
//多少元素执行多少轮
for (let round = 0; round < newArr.length; round++) {
for (let j = 0; j < newArr.length; j++) {
//执行次数加1
time = time + 1;
//临时用来保存需要交换的值
let temp;
//如果前者大于后者,则进行数据交换
if (newArr[j] > newArr[j + 1]) {
temp = newArr[j];
newArr[j] = newArr[j + 1];
newArr[j + 1] = temp;
}
}
console.log(`第${round}轮:`, newArr);
}
console.log("执行次数:", time);
return newArr;
}
console.log(bubbleSort2(dataArr));
第0轮: (6) [5, 3, 4, 2, 1, 6]
第1轮: (6) [3, 4, 2, 1, 5, 6]
第2轮: (6) [3, 2, 1, 4, 5, 6]
第3轮: (6) [2, 1, 3, 4, 5, 6]
第4轮: (6) [1, 2, 3, 4, 5, 6]
第5轮: (6) [1, 2, 3, 4, 5, 6]
执行次数: 36
2.4 实现第4步
function bubbleSort(arr) {
//拷贝数组
const newArr = [...arr];
//统计执行次数
let time = 0;
for (let round = 0; round < newArr.length; round++) {
//每进行一轮,都可以确定一个较大的元素,后边的元素无需参与排序
for (let j = 0; j < newArr.length - round; j++) {
//执行次数加1
time = time + 1;
//临时用来保存需要交换的值
let temp;
//如果前者大于后者,则进行数据交换
if (newArr[j] > newArr[j + 1]) {
temp = newArr[j];
newArr[j] = newArr[j + 1];
newArr[j + 1] = temp;
}
}
console.log(`第${round}轮:`, newArr);
}
console.log("执行次数:", time);
return newArr;
}
console.log(bubbleSort(dataArr));
第0轮: (6) [5, 3, 4, 2, 1, 6]
第1轮: (6) [3, 4, 2, 1, 5, 6]
第2轮: (6) [3, 2, 1, 4, 5, 6]
第3轮: (6) [2, 1, 3, 4, 5, 6]
第4轮: (6) [1, 2, 3, 4, 5, 6]
第5轮: (6) [1, 2, 3, 4, 5, 6]
执行次数: 21
参考链接