#include<iostream>
using namespace std;
void cocktailSort(int *array,int length){
//大循环控制所有排序回合
for(int i=0;i<length/2;i++){
//有序标记。每一轮的初始值都是true
bool isSorted=true;
//奇数轮,从左向右比较和交换
for(int j=i;j<length-i-1;j++){
if(array[j]>array[j+1]){
int temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
//有元素交换,所以不是有序的,标记变为false
isSorted=false;
}
}
if(isSorted){
break;
}
//在偶数轮之前,将isSorted重新标记为true
isSorted=true;
//偶数轮,从右向左比较和交换
for(int j=length-i-1;j>i;j--){
if(array[j]<array[j-1]){
int temp=array[j];
array[j]=array[j-1];
array[j-1]=temp;
//有元素交换,所以不是有序的,标记变为false
isSorted=false;
}
}
if(isSorted){
break;
}
}
}
void printArray(int array[],int length){
for(int i=0;i<length;i++){
cout<<array[i]<<" ";
}
return;
}
int main()
{
//array数组是一个无序数组,但是通过观察发现。除了1,其他元素都相对有序。
//这时使用冒泡排序,依然会进行7轮冒泡,造成大量不必要的时间开销,解决这种不足,
//可采用"鸡尾酒排序",即第一轮从左往右冒泡,第二轮从右往左冒泡,以此类推...
//实验表明,"鸡尾酒排序"适用于大多数元素都已经有序的情况。
int array[]={2,3,4,5,6,7,8,1};
int length=sizeof(array)/sizeof(array[0]);
cocktailSort(array,length);
printArray(array,length);
cout<<endl;
return 0;
}