#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;
}