vlambda博客
学习文章列表

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; }}


优化方案:

  1. lastIndex:记录最后一次内循环(for循环)元素交换的位置,每次循环到lastIndex 即可,因为lastIndex后的序列都是已排好,无需再次循环;

  2. flag:记录内循环(for循环)中是否发生了交换,如果没有发生交换(即flag=true),则说明该序列已经为有序序列,不需要再次执行 while 循环,直接结束