[golang] 数据结构-鸡尾酒排序

吐个槽
又是一个不正经取名的排序算法。真要说和鸡尾酒间的关系,大概就是想喝到鸡尾酒(得到排序好的队列)就要摇晃酒杯让不同的成分混合均匀(向两个方向冒泡排序)

原理
鸡尾酒排序(Cocktail Sort)是冒泡排序的一种优化算法。原本的冒泡排序只能在一轮中挑出一个值移动到最后,而鸡尾酒则可以在一轮里挑最大的移到最后,再挑最小的移到最前面。实际上就是先正向进行一轮普通的冒泡排序,然后再逆向进行一轮反向冒泡,每轮冒泡都缩小一点范围。

复杂度
最好情况是正序排列的数列O(n),最坏情况是逆序O(n^2),平均还是O(n^2)。空间复杂度都是O(1)。

排序过程
特别找来一张图,方便理解。注意看图中红色标记的元素,每次向右都是把最大的元素交换到后面,向左都是把最小的交换到前面。

代码

package main

import (
    "time"
    "fmt"
    "math/rand"
)

func main() {
    var length = 10
    var list []int

    // 以时间戳为种子生成随机数,保证每次运行数据不重复
    r := rand.New(rand.NewSource(time.Now().UnixNano()))
    for i := 0; i < length; i++ {
        list = append(list, int(r.Intn(1000)))
    }
    fmt.Println(list)

    // 只需n/2轮的比较,因为每轮里都会吧最大值移到队尾,最小值移到队首
    for loop := 1; loop < length/2; loop++ {
        sorted := false
        var j int
        // 先正向冒泡,把最大值移动到队尾
        for j = loop - 1; j < length-loop; j++ {
            if list[j] > list[j+1] {
                list[j], list[j+1] = list[j+1], list[j]
                sorted = true
            }
        }
        // 如果跑了一轮没有交换元素,说明已经排好序了
        if !sorted {
            break
        }
        // 再反向冒泡,把最小值移动到队首
        for ; j >= loop; j-- {
            if list[j] < list[j-1] {
                list[j], list[j-1] = list[j-1], list[j]
                sorted = true
            }
        }
        if !sorted {
            break
        }

        fmt.Println(list)
    }

}

运行结果

原文地址:http://blog.51cto.com/13022101/2152903

时间: 2024-11-09 17:33:20

[golang] 数据结构-鸡尾酒排序的相关文章

[golang] 数据结构-希尔排序

除了上篇介绍的二分插入排序,还有这次介绍的希尔排序(Shell's Sort),也是对直接插入排序算法的优化. 原理希尔排序,就是按某个增量值对数据进行分组,每组单独排序好后,再缩小这个增量,然后按新增量对数据分组后每个分组再各自排序.最终增加缩小到1的时候,排序结束.所以希尔排序又叫缩小增量排序(Diminishing Increment Sort) 关于增量最佳增量值的选择其实是个数学难题,有兴趣的可以自己搜下相关资料.常用的增量有 n/2(这个又叫希尔增量).n/3.2^k-1(hibba

[golang] 数据结构-地精排序

碎碎念这是一个名字起得很随便的排序算法,是我我就叫他史莱姆排序ㄟ(▔,▔)ㄏ 原理地精排序是也是一种交换排序.它只进行一轮比较,在这轮比较中,遇到比较前面元素大就向后移动一位继续比较,遇到比前面值小就和前面的值交换,并向前移动一位. 复杂度对已经排序号的队列哥布林只需从头走到尾就结束了,所以最好情况时间复杂度就是O(n),平均的时间复杂度也和冒泡排序一样也是O(n^2). 代码 package main import ( "time" "fmt" "mat

数据结构——排序——鸡尾酒排序算法

鸡尾酒排序,也就是定向冒泡排序, 鸡尾酒搅拌排序, 是冒泡排序的一种变形.此算法与冒泡排序的不同处在于排序时是以双向在序列中进行排序. 使用鸡尾酒排序为一列数字进行排序的过程 鸡尾酒算法原理 i. 先对数组从左到右进行升序的冒泡排序:  ii. 再对数组进行从右到左的降序的冒泡排序:  iii. 以此类推,持续的.依次的改变冒泡的方向,并不断缩小没有排序的数组范围: 例:         88     7     79     64     55     98     48     52    

Hark的数据结构与算法练习之鸡尾酒排序

算法说明 鸡尾酒排序又叫定向冒泡排序,鸡尾酒搅拌排序,搅拌排序,涟漪排序,回来排序,快乐小时排序. 鸡尾酒排序是交换排序的一种,它是冒泡排序的一个轻微的变种.冒泡是从低向高比较排序,鸡尾酒从低向高,从高向低交换着进行排序.大家看一下代码就知道了. 某些特殊有序数组情况下,鸡尾酒排序是效率略好于冒泡排序,例如: int[] arrayData = { 2, 3, 4, 5, 6, 7, 8, 9, 1 }; 鸡尾酒排序只排序一次就能出结果,而冒泡排序就需要8次才能出结果. 代码 使用的是java

《C算法.第1卷,基础、数据结构、排序和搜索(第三版)》pdf

下载地址:网盘下载 内容简介  · · · · · · <C算法>介绍了当今最重要的算法,共分3卷,<C算法(第1卷):基础.数据结构.排序和摸索>是第1卷.第1卷分4部分.共16章.第一部分"基础知识"(第1-2章)介绍了基本算法分析原理.第二部分"数据结构"(第3-5章)讲解算法分析中必须掌握的数据结构知识.主要包括基本数据结构.抽象数据结构.递归和树.第三部分"排序"(第6-11章)按章节顺序分别讨论了基本排序方法(

鸡尾酒排序Cocktail sort

鸡尾酒排序基于冒泡排序,双向循环 还是看例子吧,给定待排数组[2 3 4 5 1] 第一趟过去时的每一步 第一步迭代,2 < 3不换 [2 3 4 5 1] 第二步迭代,3 < 4不换 [2 3 4 5 1] 第三步迭代,4 < 5不换 [2 3 4 5 1] 第四步迭代,5 > 1交换 [2 3 4 1 5] 第一趟回来时的第一步,鸡尾酒一次到头后就回返回来,再到头后再过去,来回比,一个来回能排两个数字 第五步迭代,1 < 5不交换 [2 3 4 1 5] 第六步迭代,1

数据结构基础 排序算法(一) 概念篇

本辑将会对笔试面试最常涉及到的12种排序算法(包括插入排序.二分插入排序.希尔排序.选择排序.冒泡排序.鸡尾酒排序.快速排序.堆排序.归并排序.桶排序.计数排序和基数排序)进行详解.每一种算法都有基本介绍.算法原理分析.图解演示.算法代码.笔试面试重点分析.笔试面试题等板块. 一.插入排序 1)算法简介 插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.插入排序在实现上,通常

数据结构-各类排序算法总结[结局]

各类排序算法总结 五.分配类排序->基数排序: 基数排序是一种借助于多关键码排序的思想,是将单关键码按基数分成"多关键码"进行排序的方法.基数排序属于"低位优先"排序法,通过反复进行分配与收集操作完成排序. 对于数字型或字符型的单关键字,可以看成是由多个数位或多个字符构成的多关键字, 此时可以采用这种"分配-收集"的办法进行排序,称作基数排序法.其好处是不需要进行关键字间的比较. 例如:对下列这组关键字{278, 109, 063, 930

数据结构之排序

1.排序的分类 在待排序的文件中,若存在多个关键字相同的记录,经过排序后这些具有相同关键字的记录之间的相对次序保持不变,该排序方法是稳定的:若具有相同关键字的记录之间的相对次序发生变化,则称这种排序方法是不稳定的. 稳定的排序 时间复杂度 空间复杂度 冒泡排序 最差和平均是O(n2),最好是O(n)    1  双向冒泡排序 最差和平均是O(n2),最好是O(n)  1 插入排序 最差和平均是O(n2),最好是O(n)   1 归并排序  最差.平均.最好都是O(nlogn) O(n)  桶排序