鸡尾酒排序又叫双向冒泡排序,是冒泡排序的一种变形。它与冒泡排序的不同处在于排序时是以双向在序列中进行排序。以数组为例
数组中的数字本是无规律的排放,先找到最小的数字,把他放到第一位,然后找到最大的数字放到最后一位,然后再找到第二小的数
字放到第二位,再找到第二大的数字放到倒数第二位。以此类推,直到完成排序。
在网上找了张图,能够更直观的展示鸡尾酒的排序过程,看图
可以看到,每一趟排序中,既找到了最小的数,又找到了最大的数,分别放到首尾位置,鸡尾酒排序要比冒泡排序的效率好一点;但是,
如果一组序列是乱序的话,那么鸡尾酒排序和冒泡排序的效率就都很差了。
下面通过代码来具体展示一下鸡尾酒排序,上代码
1 #include<iostream> 2 using namespace std; 3 4 void swap(int a[],int i,int j) 5 { 6 int t; 7 t=a[i]; 8 a[i]=a[j]; 9 a[j]=t; 10 } 11 void cocktailsort(int a[],int n) 12 { 13 int i,left=0,right=n-1; 14 while(left<right) //由于是在两头同时排序,所以当left和right撞到的时候,要结束 15 { 16 for(i=left;i<right;i++) //寻找本次排序中最大的数 17 if(a[i]>a[i+1]) 18 swap(a,i,i+1); 19 right--; //此时最大的数已放在最高位了,right要向前移一位 20 for(i=right;i>left;i--) //寻找本次排序中最小的数 21 if(a[i-1]>a[i]) 22 swap(a,i-1,i); 23 left++; //此时最小的数已放在最低位了,left要向后移一位 24 } 25 } 26 int main() 27 { 28 int a[10]={34,4,78,35,8,64,45,18,26,35}; 29 int b[10]={13,7,24,8,18,7,26,5,10,28}; 30 cocktailsort(a,10); 31 cocktailsort(b,10); 32 cout<<"对数组a排序后为: "; 33 for(int i=0;i<10;i++) 34 cout<<a[i]<<" "; 35 cout<<" 对数组b排序后为: "; 36 for(int i=0;i<10;i++) 37 cout<<b[i]<<" "; 38 return 0; 39 }
测试结果如下:
2020-04-30 15:54:09