冒泡排序有没有可优化的地方?

182 阅读1分钟

每天做个总结吧,坚持就是胜利!

    /**
        @date 2021-06-18
        @description 冒泡排序有没有可优化的地方?
    */

壹(序)

冒泡排序是一个很经典的排序方法,也是最基础的排序算法之一,今天学习一下冒泡排序可优化的点。

贰(冒泡排序)

冒泡排序主要步骤如下:

  1. 比较相邻的两个元素,如果前面的元素比较大则交互位置;

  2. 对每一对相邻的元素做以上操作,最后会将最大的元素放置在尾部;

  3. 对所有元素重复以上操作,除了已经排序好的尾部;

  4. 直到比较完成。

代码实现如下:

const bubble = (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], arr[j + 1]] = [arr[j + 1], arr[j]];
      }
    }
  }

  return arr;
};

const arr = [2, 4, 6, 1, 52, 72, 78, 1, 31, 3];

console.log(bubble(arr)); // [1,  1,  2,  3,  4, 6, 31, 52, 72, 78]

叁(优化-鸡尾酒排序)

鸡尾酒排序是冒泡排序的变形,不同之处在于鸡尾酒排序是从低到高再从高到低,是双向的冒泡排序,而冒泡排序只是单向的从低到高;所以鸡尾酒排序会有稍微好一点的性能。但是在随机数序列的情况下,两者性能上的差别其实并不大。

代码实现:


const cocktailSort = (arr) => {
  let left = 0,
    right = arr.length - 1;

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

  return arr
};

const arr = [2, 4, 6, 1, 52, 72, 78, 1, 31, 3];

console.log(cocktailSort(arr)); // [1,  1,  2,  3,  4, 6, 31, 52, 72, 78]