鸡尾酒排序

鸡尾酒排序

前言

笔者最近看算法文章的时候,看到一个鸡尾酒排序的算法,是冒泡排序的一种变种。记录一下,每天一个知识点。

算法概述

鸡尾酒排序(Cocktail Sort),又称双向冒泡排序(Bidirectional Bubble Sort)、摇摆排序(Shake Sort),是对传统冒泡排序的一种改进。它在基本思想上与冒泡排序类似,但排序过程是交替地从左到右和从右到左进行的,从而可以更快地将元素移动到正确的位置。


核心思想

  • 类似于冒泡排序,通过比较相邻元素并交换顺序错误的对。
  • 不同之处在于:
    • 第一轮:从左向右遍历,把最大的元素“冒泡”到末尾
    • 第二轮:从右向左遍历,把最小的元素“沉降”到开头
    • 如此反复,每次缩小未排序部分的范围,直到整个数组有序。

特点

特性 描述
时间复杂度 最坏 O($n{2}$),平均O($n$),最好 O($n$)(已有序)
空间复杂度 O(1),原地排序
稳定性 ✅ 稳定排序(相等元素顺序不变)
是否比较排序 ✅ 是

javascript 实现示例

 var arr =[5, 1, 4, 2, 8, 0, 3];
var sortedArr = cocktailSort(clone(arr));
console.log(arr,sortedArr);


function cocktailSort(arr) {
  var len = arr.length;
  var start = 0;
  var end = len - 1;
  var isSorted = false;
  while (isSorted === false) {
    isSorted = true;
    // 第一轮:从左到右进行,大数移动到右侧
    for (var i = start; i < end; i++) {
      if (arr[i] <= arr[i + 1]) continue;
      swap(arr, i, i + 1);
      isSorted = false;
    }
    // 如果已经有序,则结束
    if(isSorted) break;
    isSorted = true;
    // 第二轮:从右到左进行,小数移动到左侧
    for (var i = end - 1; i > start; i--){
      if (arr[i] >= arr[i - 1]) continue;
      swap(arr, i, i - 1);
      isSorted = false;
    }

    start++;
    end--;
  }
  return arr;
}

// ---------辅助函数-----------
function swap(arr, i, j) {
  var temp = arr[i];
  arr[i] = arr[j];
  arr[j] = temp;
}

function clone(arr) {
  return arr.slice(0);
}

示例说明

以数组 [5, 1, 4, 2, 8, 0, 3] 为例:

  • 第一轮从左到右:将最大值 8 移动到最右边。
  • 第二轮从右到左:将最小值 0 移动到最左边。
  • 依此类推,每轮缩小排序区间,直到全部有序。

优点 & 缺点

优点 缺点
比普通冒泡排序快一些(尤其在两端有极值时) 时间复杂度仍为 O(n^2),不适合大数据集
实现简单、稳定 效率远低于快速排序、归并排序等高级算法

使用场景

  • 数据量较小的教学场景。
  • 当数据已经接近有序时效率较高。
  • 用于演示排序算法中的“优化思想”。

posted on 2025-06-28 14:20  李明卫  阅读(257)  评论(1)    收藏  举报

导航