zoukankan      html  css  js  c++  java
  • 鸡尾酒排序

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

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

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

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

           

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

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

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

     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

  • 相关阅读:
    【模板】Sparse-Table
    UVa 11235 Frequent values
    【模板】树状数组
    UVa 1428 Ping pong
    数学技巧
    UVa 11300 Spreading the Wealth
    UVa 11729 Commando War
    UVa 11292 Dragon of Loowater
    POJ 3627 Bookshelf
    POJ 1056 IMMEDIATE DECODABILITY
  • 原文地址:https://www.cnblogs.com/buanxu/p/12809229.html
Copyright © 2011-2022 走看看