鸡尾酒排序

入门

冒泡排序的改进版,减少某些情况下的遍历次数。

用你自己的数组跑一遍

AlgoAnim · 鸡尾酒排序
速度
待机
// 源代码
1void cocktailSort(int arr[], int n) {
2    bool swapped = true;
3    int start = 0, end = n - 1;
4    while (swapped) {
5        swapped = false;
6        for (int i = start; i < end; i++)
7            if (arr[i] > arr[i+1]) { swap(arr[i], arr[i+1]); swapped = true; }
8        end--;
9        if (!swapped) break;
10        swapped = false;
11        for (int i = end; i > start; i--)
12            if (arr[i] < arr[i-1]) { swap(arr[i], arr[i-1]); swapped = true; }
13        start++;
14    }
15}

复杂度分析

时间 O(n²)
空间 O(1)
最优 O(n)
最坏 O(n²)

算法讲解

鸡尾酒排序是冒泡排序的变体,交替从两个方向遍历数组。

从左到右遍历将最大值移到末尾,从右到左遍历将最小值移到开头。

对于"乌龟"(小值在末尾)的情况,鸡尾酒排序比普通冒泡更快。

时间复杂度仍为 O(n²),但实际运行中可能更少的遍历次数。