鸡尾酒排序法,又名双向冒泡排序法,算法传统冒泡法的一点改进。但是对于鸡尾酒排序,算法的时间复杂度与空间复杂度并没有改进。
不同的是排序的交换次数。某些情况下鸡尾酒排序比普通冒泡排序的交换次数少。比如{2,3,4,1},鸡尾酒排序只需交换2次,而冒泡排序需要三次。总体上,鸡尾酒排序可以获得比冒泡排序稍好的性能。但是完全逆序时,鸡尾酒排序与冒泡排序的效率都非常差。
鸡尾酒排序的思想就是在从前往后依次循环依靠邻近数据交换实现结果的同时,依次从后往前循环数据交换。前者交换获取未排序最大值,而后者交换获取未排序最小值。实现过程如下图:
整个算法如下:
#include<iostream>
using namespace std;
/*
@鸡尾酒排序,对传统冒泡法的改进
@输入:nData[]待排序数组,nLen数据个数
@输出:void
*/
void CockTailSort(int nData[], int nLen)
{
//是否需要进一步排序标志位
int isSorted = false;
//鸡尾酒排序前后同时进行,只需要迭代一半就行
for (int i = 0; i < nLen / 2; i++)
{
//每次都需要重置标志位!!!
isSorted = false;
//从前往后
for (int j = i; j < nLen - i-1; j++)
{
if (nData[j]>nData[j + 1])
{
swap(nData[j], nData[j + 1]);
isSorted = true;
}
}
//从后往前
for (int j = nLen-1-i; j >i; j--)
{
if (nData[j]<nData[j -1])
{
swap(nData[j], nData[j -1]);
isSorted = true;
}
}
//排序完成就跳出
if (isSorted == false)
break;
}
}
int main()
{
int nArr[] = { 2, 1, 4, 3, 5, 0};
CockTailSort(nArr, sizeof(nArr) / sizeof(int));
for (int i = 0; i < sizeof(nArr) / sizeof(int); i++)
cout << nArr[i] << '\t';
return 0;
}
个人学习记录,由于能力和时间有限,如果有错误望读者纠正,谢谢!