12月第31题:如何优化冒泡排序?
function bubbleSort(arr) {// 判断数组元素大于1if (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 循环结束标记为falseflag = 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 循环,直接结束
