zoukankan      html  css  js  c++  java
  • 数据结构——排序——鸡尾酒排序算法

    鸡尾酒排序,也就是定向冒泡排序, 鸡尾酒搅拌排序, 是冒泡排序的一种变形。此算法与冒泡排序的不同处在于排序时是以双向在序列中进行排序。

    使用鸡尾酒排序为一列数字进行排序的过程

    鸡尾酒算法原理

      i. 先对数组从左到右进行升序的冒泡排序;
      ii. 再对数组进行从右到左的降序的冒泡排序;
      iii. 以此类推,持续的、依次的改变冒泡的方向,并不断缩小没有排序的数组范围;

    例:         88     7     79     64     55     98     48     52     4      13
    第一趟:      7     79    64     55     88     48     52      4      13    98
    第二趟:    4      7     79     64     55     88     48     42     13    98
    第三趟:    4      7     64     55     79     48     42     13     88    98
    第四趟:    4      7     13     64     55     79     48     42     88    98
    第五趟:    4      7     13     55     64      48    42     79     88    98
    第六趟:    4      7     13     42     55      64    48     79     88    98
    第七趟:    4      7     13     42     55      48    64     79     88    98
    第八趟:    4      7     13     42     48      55    64     79     88    98 

    #include<stdio.h>    
    #include<stdbool.h>  
    
    void swap(int *a, int *b)   //交换两元素的值
    {
        int t;
        t = *a;
        *a = *b;
        *b = t;
    }
    
    void printArray(int a[], int count)   //打印数组元素
    {
        int i;
        for(i = 0; i < count; i++)
            printf("%d ",a[i]);
        printf("
    ");
    }
    void cocktail_sort(int a[], int size){    //数组中的第一个数为0索引
        int i, bottom = 0;
        int top = size - 1;
        bool swapped = true; 
        while(swapped)    //假如没有元素交换,则数组有序
        {
            swapped = false; 
            for(i = bottom; i < top; i++)
            {
                if(a[i] > a[i + 1])      //判断两个元素是否正确的顺序
                {
                    swap(&a[i], &a[i + 1]);     //让两个元素交换顺序
                    swapped = true;
                }
            }
            // 将未排序部分的最大元素交换到顶端
            top = top - 1; 
            for(i = top; i > bottom; i--)
            {
                if(a[i] < a[i - 1]) 
                {
                    swap(&a[i], &a[i - 1]);
                    swapped = true;
                }
            }
            //将未排序部分的最小元素交换到底端
            bottom = bottom + 1;  
        }
    }
    int main(void)   
    {
        int a[] = {3, 5, 4, 6, 9, 7, 8, 0, 1};
        int n = sizeof(a) / sizeof(*a);
        printArray(a, n);
        cocktail_sort(a, n);
        printArray(a, n);
        return 0;
    }

    与冒泡排序不同的地方:

    鸡尾酒排序等于是冒泡排序的轻微变形。不同的地方在于从低到高然后从高到低,而冒泡排序则仅从低到高去比较序列里的每个元素。他可以得到比冒泡排序稍微好一点的效能,原因是冒泡排序只从一个方向进行比对(由低到高),每次循环只移动一个项目。

    以序列(2,3,4,5,1)为例,鸡尾酒排序只需要访问一次序列就可以完成排序,但如果使用冒泡排序则需要四次。 但是在乱数序列的状态下,鸡尾酒排序与冒泡排序的效率都很差劲。

    http://www.cnblogs.com/archimedes/p/cocktail-sort-algorithm.html

  • 相关阅读:
    全能VIP音乐在线解析
    wordpress插件推荐
    day 34 IO模型
    day 33 协程、 socketserver模块
    day 32-2 练习
    day 32-2 并发编程——认识线程(下)
    day 32 练习
    day 32 并发编程——认识线程(上)
    day 31-1 练习
    day 31-1 守护进程、互斥锁、队列、生产消费模型
  • 原文地址:https://www.cnblogs.com/qq1129496211/p/4047112.html
Copyright © 2011-2022 走看看