es6 冒泡排序

489 阅读1分钟

冒泡排序(Bubble Sort)

一、算法描述

依次比较数组中的前后两个元素,如果前一个元素大于后者则交换位置,这样每次循环后小的就会出现在前面,直到没有可交换的位置

二、算法实现

  1. 首先数组中第一个个第二个比较,如果前者大于后者交换位置,否则不交换
  2. 继续处理步骤一,第二个和第三个元素进行比较
  3. 继续重复1、2 知道所有元素比较完成

三、具体代码实现

function bubbleSortV1(arr = []) {
  if (arr.length === 0) {
    return arr;
  }

  for (let i = 0; i < arr.length - 1; i++) {
    for (let j = 0; j < arr.length - 1 - i; j++) {
      if (arr[j] > arr[j + 1]) {
        [arr[j + 1], arr[j]] = [arr[j], arr[j + 1]];
      }
    }
  }

  return arr;
}

注意:第一版本有个不好的情况,如果最后一次冒泡下标不是结尾元素,但是还是会去走一遍直到结尾,所以我们可以改进,记录最后一次冒泡下标,下次循环到此就终止,没必要继续循环

冒泡升级版

function bubbleSortV2(arr = []) {
  if (arr.length === 0) {
    return arr;
  }

  let endIdx = arr.length - 1;

  for (let i = 0; i < arr.length - 1; i++) {
    let idx = i;
    // endIdx 到冒泡结尾处 就ok 说明后面已经排好
    for (let j = 0; j < endIdx; j++) {
      if (arr[j] > arr[j + 1]) {
        [arr[j + 1], arr[j]] = [arr[j], arr[j + 1]];
        idx = j;
      }
    }
    endIdx = idx; // 冒泡结尾处
  }

  return arr;
}

普通冒泡每次只能找到最大值或者最小值,我们可以同时进行,加快排序速度

function bubbleSortV2(arr = []) {
  if (arr.length === 0) {
    return arr;
  }

  let left = 0;
  let right = arr.length - 1;

  while (left < right) {
    for (let i = left; i < right; i++) {
      if (arr[i] > arr[i + 1]) {
        [arr[i + 1], arr[i]] = [arr[i], arr[i + 1]];
      }
    }
    right--;

    for (let i = right; i > left; i--) {
      if (arr[i] < arr[i - 1]) {
        [arr[i - 1], arr[i]] = [arr[i], arr[i - 1]];
      }
    }
    left++;
  }

  return arr;
}

四、图示

754476-924014d631039f01.gif