12月第31题:如何优化冒泡排序?
function bubbleSort(arr) {
// 判断数组元素大于1
if (Array.isArray(arr) || arr.length <= 1) return;
// lastIndex: 记录最后一次内循环(for循环)元素交换的位置;
// 每次循环到lastIndex, 优化性能;
// 因为lastIndex后的序列都是已排好;
let lastIndex = arr.length - 1;
while (lastIndex > 0) {
// flag:记录内循环(for循环)中是否发生了交换;
// 如果没有发生交换(即flag=true),则说明该序列已经为有序序列;
// 不需要再次执行 while 循环,直接结束
let flag = true,
// 每次循环到lastIndex;
k = lastIndex;
for (let j = 0; i < k; j++) {
if (arr[j] > arr[j + 1]) {
// while 循环结束标记为false
flag = false;
// 记录最后一次内循环(for循环)元素交换的位置
lastIndex = j;
// 交换数组中相邻元素位置
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
}
}
// 内循环结束后,跳出while循环
if (flag) break;
}
}
优化方案:
lastIndex:记录最后一次内循环(for循环)元素交换的位置,每次循环到lastIndex 即可,因为lastIndex后的序列都是已排好,无需再次循环;
flag:记录内循环(for循环)中是否发生了交换,如果没有发生交换(即flag=true),则说明该序列已经为有序序列,不需要再次执行 while 循环,直接结束