C++实现双向起泡排序(鸡尾酒排序)算法详解
双向起泡排序是传统冒泡排序的改进版本,通过将相邻元素的两两比较改为从前向后和从后向前两个方向进行,能够在一轮排序中同时确定序列中的最大值和最小值的位置。这种正反交替的处理方式在处理部分有序的数据时,通常比标准单向冒泡排序具有更高的效率。
算法核心思想
双向起泡排序,常被称为鸡尾酒排序(Cocktail Sort),其基本逻辑建立在冒泡排序的基础之上。传统冒泡排序仅关注将较大的元素逐步“冒泡”至序列末尾,而双向起泡则引入了反向扫描机制:
- 正向扫描:从序列起始位置开始,依次比较相邻元素,若顺序错误则交换。此过程结束后,最大的未排序元素会被移动到当前未排序区间的末尾。
- 反向扫描:接着从当前区间末尾向前遍历,同样比较并交换逆序对。此过程完成后,最小的未排序元素会被移动到当前未排序区间的开头。
这一往返过程不断缩减待排序范围(即缩小左右边界 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++双向起泡排序的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













