鸡尾酒排序算法c语言,[golang] 数据结构-鸡尾酒排序
吐个槽
又是一个不正经取名的排序算法。真要说和鸡尾酒间的关系,大概就是想喝到鸡尾酒(得到排序好的队列)就要摇晃酒杯让不同的成分混合均匀(向两个方向冒泡排序)
原理
鸡尾酒排序(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] 数据结构-鸡尾酒排序相关推荐
- 经典的十种排序算法 C语言版
经典的十种排序算法(C语言版) 1.冒牌排序 冒牌排序的特点 一趟一趟的比较待排序的数组,每趟比较中,从前往后,依次比较这个数和下一个数的大小,如果这个数比下一个数大,则交换这两个数,每趟比较后, ...
- c语言代码先来先服务算法_C语言十大经典排序算法(动态演示+代码,值得收藏)...
以前也零零碎碎发过一些排序算法,但排版都不太好,又重新整理一次,排序算法是数据结构的重要部分,系统地学习很有必要. 时间.空间复杂度比较 排序算法 平均时间复杂度 最差时间复杂度 空间复杂度 数据对象 ...
- 【数据结构(C语言)】数据结构-内部排序
内部排序 文章目录 内部排序 一.概述 (1)排序定义 (2)稳定性 (3)内部排序和外部排序 (4)两种基本操作 (5)数据类型定义 二.分类 (1)插入排序 (2)交换排序 (3)选择排序 (4) ...
- 数据结构排序算法实验报告_[数据结构与算法系列]排序算法(二)
我的上一篇文章向大家介绍了排序算法中的冒泡排序.插入排序和选择排序.它们都是平均时间复杂度为 O(n^2) 的排序算法,同时还为大家讲解了什么是原地排序和什么是排序的稳定性.下图是这三种算法的比较,不 ...
- 九大排序算法告诉你什么是内部排序和外部排序
概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们通常所说的排序算法往往指的是内部排序算法, ...
- 排序算法竟能如此美丽?排序算法可视化大全!
文章目录 首荐:VisuAlgo 各算法对比 最炫酷的 比较聪明的 最古老的 开源的Javascript程序 我的方法(伪):折线可视化 开源Python脚本 舞蹈可视化 内存状态可视化 首荐:Vis ...
- 【排序算法】python 十大经典排序算法(全网最详)
排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.常见的内部排序算法有:插入排序.希尔排序.选 ...
- 【排序算法】冒泡排序、简单选择排序、直接插入排序比较和分析
[排序算法]冒泡排序.简单选择排序.直接插入排序比较和分析 写在前面: 本文简单介绍了冒泡排序.简单选择排序.直接插入排序,并对这三种排序进行比较,入参都是80000个随机数,比较算法耗时.进一步,我 ...
- Java 与排序算法(2):选择排序
一.选择排序 选择排序(Selection Sort)是一种简单的排序算法,其基本思想是在待排序序列中选择最小(或最大)的元素,将其与序列的第一个元素交换位置,然后在剩余的元素中继续选择最小(或最大) ...
最新文章
- [case19]聊聊eureka的TaskDispatcher
- 阿姨帮万勇:O2O产品的颠覆与布局,阿姨帮未来发展战略独家披露
- 100以内 蝗 靓耸 6的c语言怎,C语言学习C6.ppt
- refreshtoken用mysql_「SpringCloud」 Spring Security OAuth2 Mysql管理在线Token
- Linux学习之系统编程篇:PCB( 进程控制块)、进程状态、转换和控制
- 深入浅出之string
- Mac下安装LNMP(Nginx+PHP5.6)环境
- 【LeetCode-面试算法经典-Java实现】【002-Add Two Numbers (单链表表示的两个数相加)】...
- python短时傅里叶变换_短时傅里叶变换的python实现
- super在python中有什么用
- 百度实习笔试题(2012.5.6)
- 差分输出和单端输出的区别(转载)
- SQlite Android数据库的应用 Android SQLite 简易的学生成绩管理系统
- vivado simulation仿真(38译码器实现)
- linux kylin 终端字体,安装Nerd Fonts字体
- 串口发送程序linux,单片机IO口模拟串口程序(发送+接收
- 【音频特征】语音特征小结
- word中图片为嵌入式格式时显示不全_word嵌入图片显示不全,教您word插入图片显示不全怎么办...
- java 多线程分段等待执行完成状况,循环屏障CyclicBarrier | Java工具类
- 2023大连海洋大学计算机考研信息汇总
热门文章
- Docker image Introduce
- mongodb集群与分片的配置说明
- c语言基础知识_结构体访问,共同体,枚举类型
- 数字IC验证学习(二)
- C++总结笔记(十)——堆区内存开辟数组和二级指针
- android另类工具,[置顶] android应用程序开发另解及Android SDK工具集的另类用法
- php 加入日志功能,php怎么写一个日志功能的函数
- shiro前后端分离_为什么要前后端分离?前后端分离的优点是什么?
- 科技鸿蒙系统一千章,第一千六百零七章 鸿蒙紫气,成圣之机 (上)
- 究极日月服务器维护时间,超激斗梦境9月25日终极测试服务器维护公告_超激斗梦境9月25日更新了什么_玩游戏网...