吐个槽

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

原理

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

复杂度

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

排序过程

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

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

代码

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)

}

}

运行结果

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

©著作权归作者所有:来自51CTO博客作者NicoChen的原创作品,如需转载,请注明出处,否则将追究法律责任

鸡尾酒排序算法c语言,[golang] 数据结构-鸡尾酒排序相关推荐

  1. 经典的十种排序算法 C语言版

    经典的十种排序算法(C语言版) 1.冒牌排序 冒牌排序的特点 ​ 一趟一趟的比较待排序的数组,每趟比较中,从前往后,依次比较这个数和下一个数的大小,如果这个数比下一个数大,则交换这两个数,每趟比较后, ...

  2. c语言代码先来先服务算法_C语言十大经典排序算法(动态演示+代码,值得收藏)...

    以前也零零碎碎发过一些排序算法,但排版都不太好,又重新整理一次,排序算法是数据结构的重要部分,系统地学习很有必要. 时间.空间复杂度比较 排序算法 平均时间复杂度 最差时间复杂度 空间复杂度 数据对象 ...

  3. 【数据结构(C语言)】数据结构-内部排序

    内部排序 文章目录 内部排序 一.概述 (1)排序定义 (2)稳定性 (3)内部排序和外部排序 (4)两种基本操作 (5)数据类型定义 二.分类 (1)插入排序 (2)交换排序 (3)选择排序 (4) ...

  4. 数据结构排序算法实验报告_[数据结构与算法系列]排序算法(二)

    我的上一篇文章向大家介绍了排序算法中的冒泡排序.插入排序和选择排序.它们都是平均时间复杂度为 O(n^2) 的排序算法,同时还为大家讲解了什么是原地排序和什么是排序的稳定性.下图是这三种算法的比较,不 ...

  5. 九大排序算法告诉你什么是内部排序和外部排序

    概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们通常所说的排序算法往往指的是内部排序算法, ...

  6. 排序算法竟能如此美丽?排序算法可视化大全!

    文章目录 首荐:VisuAlgo 各算法对比 最炫酷的 比较聪明的 最古老的 开源的Javascript程序 我的方法(伪):折线可视化 开源Python脚本 舞蹈可视化 内存状态可视化 首荐:Vis ...

  7. 【排序算法】python 十大经典排序算法(全网最详)

    排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.常见的内部排序算法有:插入排序.希尔排序.选 ...

  8. 【排序算法】冒泡排序、简单选择排序、直接插入排序比较和分析

    [排序算法]冒泡排序.简单选择排序.直接插入排序比较和分析 写在前面: 本文简单介绍了冒泡排序.简单选择排序.直接插入排序,并对这三种排序进行比较,入参都是80000个随机数,比较算法耗时.进一步,我 ...

  9. Java 与排序算法(2):选择排序

    一.选择排序 选择排序(Selection Sort)是一种简单的排序算法,其基本思想是在待排序序列中选择最小(或最大)的元素,将其与序列的第一个元素交换位置,然后在剩余的元素中继续选择最小(或最大) ...

最新文章

  1. [case19]聊聊eureka的TaskDispatcher
  2. 阿姨帮万勇:O2O产品的颠覆与布局,阿姨帮未来发展战略独家披露
  3. 100以内 蝗 靓耸 6的c语言怎,C语言学习C6.ppt
  4. refreshtoken用mysql_「SpringCloud」 Spring Security OAuth2 Mysql管理在线Token
  5. Linux学习之系统编程篇:PCB( 进程控制块)、进程状态、转换和控制
  6. 深入浅出之string
  7. Mac下安装LNMP(Nginx+PHP5.6)环境
  8. 【LeetCode-面试算法经典-Java实现】【002-Add Two Numbers (单链表表示的两个数相加)】...
  9. python短时傅里叶变换_短时傅里叶变换的python实现
  10. super在python中有什么用
  11. 百度实习笔试题(2012.5.6)
  12. 差分输出和单端输出的区别(转载)
  13. SQlite Android数据库的应用 Android SQLite 简易的学生成绩管理系统
  14. vivado simulation仿真(38译码器实现)
  15. linux kylin 终端字体,安装Nerd Fonts字体
  16. 串口发送程序linux,单片机IO口模拟串口程序(发送+接收
  17. 【音频特征】语音特征小结
  18. word中图片为嵌入式格式时显示不全_word嵌入图片显示不全,教您word插入图片显示不全怎么办...
  19. java 多线程分段等待执行完成状况,循环屏障CyclicBarrier | Java工具类
  20. 2023大连海洋大学计算机考研信息汇总

热门文章

  1. Docker image Introduce
  2. mongodb集群与分片的配置说明
  3. c语言基础知识_结构体访问,共同体,枚举类型
  4. 数字IC验证学习(二)
  5. C++总结笔记(十)——堆区内存开辟数组和二级指针
  6. android另类工具,[置顶] android应用程序开发另解及Android SDK工具集的另类用法
  7. php 加入日志功能,php怎么写一个日志功能的函数
  8. shiro前后端分离_为什么要前后端分离?前后端分离的优点是什么?
  9. 科技鸿蒙系统一千章,第一千六百零七章 鸿蒙紫气,成圣之机 (上)
  10. 究极日月服务器维护时间,超激斗梦境9月25日终极测试服务器维护公告_超激斗梦境9月25日更新了什么_玩游戏网...