C++实现双向起泡排序(鸡尾酒排序)算法详解

叶初
叶初
发布时间:2026-10-15| 6人浏览过
原创

双向起泡排序是传统冒泡排序的改进版本,通过将相邻元素的两两比较改为从前向后和从后向前两个方向进行,能够在一轮排序中同时确定序列中的最大值和最小值的位置。这种正反交替的处理方式在处理部分有序的数据时,通常比标准单向冒泡排序具有更高的效率。

算法核心思想

双向起泡排序,常被称为鸡尾酒排序(Cocktail Sort),其基本逻辑建立在冒泡排序的基础之上。传统冒泡排序仅关注将较大的元素逐步“冒泡”至序列末尾,而双向起泡则引入了反向扫描机制:

  1. 正向扫描:从序列起始位置开始,依次比较相邻元素,若顺序错误则交换。此过程结束后,最大的未排序元素会被移动到当前未排序区间的末尾。
  2. 反向扫描:接着从当前区间末尾向前遍历,同样比较并交换逆序对。此过程完成后,最小的未排序元素会被移动到当前未排序区间的开头。

这一往返过程不断缩减待排序范围(即缩小左右边界 low 和 high),直到整个序列完全有序或某一趟遍历中未发生任何交换操作,表明排序已完成。

C++ 实现步骤

第1步:定义辅助函数

为了实现清晰的结构,首先定义用于交换数据和打印数组状态的辅助函数。在实际排序算法内部,交换操作可以通过标准库函数或手动指针交换完成。

第2步:构建双向起泡主逻辑

初始化左边界 low = 0 和右边界 high = n - 1。使用一个布尔变量 flag 监控每一轮是否发生了交换,若某轮往返均未交换,则提前结束循环。在每一轮循环中,先执行正向冒泡,再执行反向冒泡。

#include<iostream>
using namespace std;

// 交换两个数的引用
void swap(int &i, int &j)
{
    int t = i;
    i = j;
    j = t;
}

// 打印数组状态
void show(int a[], int n)
{
    for(int i = 0; i < n; i++)
    {
        cout << a[i] << " ";
    }
    cout << endl;
}

// 双向起泡排序核心算法
void bubblesort(int a[], int n)
{
    int low = 0, high = n-1;
    bool flag = true;

    // 当左右边界未相遇且上一轮发生过交换时继续
    while(low < high && flag)
    {   
        flag = false; // 重置标志位

        // 正向扫描:从低到高,确定最大值位置
        int i = low;
        while(i < high)
        {
            if(a[i] > a[i + 1])
            {
                swap(a[i], a[i + 1]);
                flag = true; // 标记发生了交换
            }
            i++;
        }
        high--; // 最大元素已就位,右边界左移

        // 反向扫描:从高到低,确定最小值位置
        int j = high;
        while(j > low)
        {
            if(a[j] < a[j-1])
            {
                swap(a[j-1], a[j]);
                flag = true; // 标记发生了交换
            }
            j--;
        }
        low++; // 最小元素已就位,左边界右移
    }
}

int main(){
    int a[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
    int n = 10;

    // 执行双向冒泡排序
    bubblesort(a, n);

    // 输出最终结果
    cout << "after sort" << endl;
    show(a, n);

    return 0;
}

执行过程演示与结果分析

以上代码针对初始数组 {10, 9, ..., 1} 进行了排序。由于初始状态完全逆序,双向排序的优势能明显体现在快速移动极值上。中间过程的关键状态变化如下:

10 9 8 7 6 5 4 3 2 1
1 9 8 7 6 5 4 3 2 10
1 2 8 7 6 5 4 3 9 10
1 2 3 7 6 5 4 8 9 10
1 2 3 4 6 5 7 8 9 10
after sort
1 2 3 4 5 6 7 8 9 10

分析:

  • 第一轮:正向扫描将最大值 10 移至末尾;反向扫描将最小值 1 移至开头。此时数组变为 1 ... 10。
  • 后续轮次:随着 low 和 high 边界的向内收缩,剩下的元素迅速归位。例如第二轮将 2 移至左侧,9 移至右侧。
  • 终止条件:当所有元素归位,low 与 high 相遇或在某一轮中 flag 保持为 false 时,排序结束。

算法特点与适用场景

  • 时间复杂度:最坏情况和平均情况为 $O(N^2)$,但在最佳情况(已有序)下为 $O(N)$,优于普通冒泡排序。
  • 空间复杂度:$O(1)$,属于原地排序算法。
  • 优势:在解决“两端固定、中间混乱”或部分有序的数据集时,比普通冒泡排序效率更高,因为它能在一次遍历中处理两端的极值。
  • 劣势:相比于快速排序、归并排序等高级算法,其在大规模随机数据下的性能依然较差,适合教学演示或小型数据集处理。

以上就是C++实现双向起泡排序算法的详细内容,更多关于C++双向起泡排序的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。