首页 > 技术文章 > 鸡尾酒排序

buanxu 2020-04-30 15:54 原文

    鸡尾酒排序又叫双向冒泡排序,是冒泡排序的一种变形。它与冒泡排序的不同处在于排序时是以双向在序列中进行排序。以数组为例

    数组中的数字本是无规律的排放,先找到最小的数字,把他放到第一位,然后找到最大的数字放到最后一位,然后再找到第二小的数

放到第二位,再找到第二大的数字放到倒数第二位。以此类推,直到完成排序。

    在网上找了张图,能够更直观的展示鸡尾酒的排序过程,看图

       

    可以看到,每一趟排序中,既找到了最小的数,又找到了最大的数,分别放到首尾位置,鸡尾酒排序要比冒泡排序的效率好一点;但是,

如果一组序列是乱序的话,那么鸡尾酒排序和冒泡排序的效率就都很差了。

    下面通过代码来具体展示一下鸡尾酒排序,上代码

 

 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排序后为:\n";
33     for(int i=0;i<10;i++)
34         cout<<a[i]<<" ";
35     cout<<"\n对数组b排序后为:\n";
36     for(int i=0;i<10;i++)
37         cout<<b[i]<<" ";
38     return 0;
39 }

测试结果如下:

 

2020-04-30    15:54:09

推荐阅读