算法:鸡尾酒排序

双向冒泡排序也被称为鸡尾酒排序、鸡尾酒调酒器排序、摇床排序、涟漪排序、洗牌排序、班车排序等。(再多再华丽丽的名字也难以弥补它的低效)

  • 鸡尾酒排序,是冒泡排序的改良
  • 大部分元素都有序的时候,可以用鸡尾酒排序、地精排序

冒泡排序

冒泡排序的每一个元素都可以像小气泡一样,根据自身大小,一点一点向着数组的一侧移动。

原理

  • 比较相邻的元素。如果第一个比第二个大,就交换他们两个
  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
  • 针对所有的元素重复以上的步骤,除了最后一个。
  • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

一般情况下,可以通过下面的动画理解冒泡排序。

现在我们来看一组特殊数据如果使用冒泡排序会怎么样。

将无序数列:2,3,4,5,6,7,8,1,使用冒泡排序使其从小到大排序。

进行逐步分析:

第一轮操作( 8 和 1 交换 )
在这里插入图片描述
第二轮操作( 7 和 1 交换 )
在这里插入图片描述
第三轮操作( 6 和 1 交换 )
在这里插入图片描述
第四轮操作( 5 和 1 交换 )
在这里插入图片描述
第五轮操作( 4 和 1 交换 )
在这里插入图片描述
第六轮操作( 3 和 1 交换 )
在这里插入图片描述
第七轮操作( 2 和 1 交换 )
在这里插入图片描述
仔细观察上面的这组无序数列,实际上只有 1 的位置不在该在的位置,而 2 ,3 ,4 ,5 ,6 ,7 ,8 都已经有序了,结果使用冒泡排序,需要 折腾 7 次才能将 1 归位。

兔子示例图等待补充:

{6, 1, 2, 3, 4, 5}

从上面可以看出,冒泡排序有意i给很大的问题:它的运行时间依赖于数组的初始排序。大的数(兔子)上升得很快,而小的数(乌龟)下降的很慢。

冒泡排序中,尾部小数值称为乌龟,头部大数值叫做兔子。

鸡尾酒排序

鸡尾酒排序,也就是定向冒泡排序,鸡尾酒搅拌排序,搅拌排序(也可以视作选择排序的一种变形),涟漪排序,来回排序或快乐小时排序,是冒泡排序的一种变形。

在这里插入图片描述
此算法与冒泡排序的不同处在于排序时是以双向在序列中进行排序。

排序过程:

  • 先对数组从左到右进行冒泡排序(升序),则最大的元素去到最右端
  • 再对数组从右到左进行冒泡排序(降序),则最小的元素去到最左端
  • 以此类推,依次改变冒泡的方向,并不断缩小未排序元素的范围,直到最后一个元素结束

第一轮操作( 8 和 1 交换 )
在这里插入图片描述
第二轮操作 ( 从序列右边开始遍历 )
在这里插入图片描述
第三轮操作 ( 从左向右比较和交换 )
在这里插入图片描述
在这一轮操作中,没有元素位置交换,证明已经有序,排序结束。对比 冒泡排序 ,鸡尾酒排序只需要 3 轮操作就可以完成排序。

代码实现

java

    private static void BubbleSort(int[] arr){int left = 0, right = arr.length - 1;  // 无序区间索引while (left < right){for (int i = left; i < right; i++){ //第一次比较时: i = 数组的最后一个元素的索引时跳出循环。 因为最后一个元素就不需要比较if (arr[i] > arr[i+1]){swap(arr, i, i+1);}}right--;}}private static void CocktailSort(int[] arr){int left = 0, right = arr.length - 1;  // 无序区间索引while (left < right){// 从左到右边:最大的放在右边for (int i = left; i < right; i++){if (arr[i] > arr[i+1]){swap(arr, i, i+1);}}right--;//    System.out.println(Arrays.toString(arr));// 从右到左:最小的放到右边for (int i = right; i > left; i--){if (arr[i] < arr[i-1]){swap(arr, i, i-1);}}//   System.out.println(Arrays.toString(arr));left++;}}private static void swap(int[] arr, int i , int j){int t = arr[i];arr[i] = arr[j];arr[j] = t;}public static void main(String[] args) {int[] arr = new int[]{77, 66, 33, 3,2,3,2,5,333,45566,2345678,78,990,12,432,56};CocktailSort(arr);System.out.println(Arrays.toString(arr));}

优化:一旦没有任何元素发生交换,就表示数据已经有序了

    private static void BubbleSort(int[] arr){int left = 0, right = arr.length - 1;  // 无序区间索引boolean swap = false;while (left < right){swap = false;for (int i = left; i < right; i++){ //第一次比较时: i = 数组的最后一个元素的索引时跳出循环。 因为最后一个元素就不需要比较if (arr[i] > arr[i+1]){swap(arr, i, i+1);swap = true;}}//当前这一轮比较中没有发生交换:表示有序if (swap == false){break;}right--;}}private static void CocktailSort(int[] arr){int left = 0, right = arr.length - 1;  // 无序区间索引boolean swap = false;while (left < right){swap = false;// 从左到右边:最大的放在右边for (int i = left; i < right; i++){if (arr[i] > arr[i+1]){swap(arr, i, i+1);swap = true;}}right--;//    System.out.println(Arrays.toString(arr));// 从右到左:最小的放到右边for (int i = right; i > left; i--){if (arr[i] < arr[i-1]){swap(arr, i, i-1);swap = true;}}//   System.out.println(Arrays.toString(arr));if (swap == false){break;}left++;}}private static void swap(int[] arr, int i , int j){int t = arr[i];arr[i] = arr[j];arr[j] = t;}public static int[] generateRandomArray(int length, int rangeL, int rangeR){if (length <0  || rangeR <= rangeL) {return null;};return  new Random().ints(rangeL, rangeR).limit(length).toArray();}public static void main(String[] args) {//  int[] arr = new int[]{77, 66, 33, 3,2,3,2,5,333,45566,2345678,78,990,12,432,56};int [] arr =  generateRandomArray(1000000, -10000, 10000);long start = System.currentTimeMillis(); // 记录起始时间CocktailSort(arr);long end = System.currentTimeMillis();       // 记录结束时间System.out.println(end-start);System.out.println(Arrays.toString(arr));}

golang

package mainimport ("fmt"
)func bobbleSort(arr [] int)[]int{length := len(arr)if length <= 1 {return arr}else{for i := 0; i < length ; i++ {exchange := falseleft,  right :=  0,  length - 1 - i;// 无序区间索引for j := left; j < right ; j++{if arr[j] > arr[j + 1] {arr[j], arr[j + 1] = arr[j + 1], arr[j];exchange = true}}if !exchange {break}}return arr;}
}func cocktailSort(arr [] int)[]int{length := len(arr)if length <= 1 {return arr}else{left,  right :=  0,  length - 1;// 无序区间索引for left < right {exchange := falsefor j := left; j < right ; j++{if arr[j] > arr[j + 1] {arr[j], arr[j + 1] = arr[j + 1], arr[j]exchange = true}}right--for j := right; j > left ; j--{if arr[j] < arr[j - 1] {arr[j], arr[j - 1] = arr[j - 1], arr[j]exchange = true}}left++if !exchange {break}}return arr;}
}func main() {arr:=[]int {1,9,2,8,3,7,4,6,5,10, -1}fmt.Println(cocktailSort(arr))fmt.Println(arr)
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/38845.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文解决投骰子类的算法题

目录 首先来看一道经典的问题&#xff1a;n个骰子的点数 我们再来看另一个问题&#xff1a;掷骰子的N种方法 牢记投骰子类问题的解决方法&#xff1a;动态规划 首先来看一道经典的问题&#xff1a;n个骰子的点数 题目是这样的&#xff1a;把n个骰子扔在地上&#xff0c;所有…

21天经典算法之冒泡排序

​ ​ 活动地址&#xff1a;CSDN21天学习挑战赛 专栏前言: 本专栏主要是算法训练&#xff0c;目的很简单。就是为了进厂 最近官方在组织 21 天挑战赛&#xff0c;趁此机会我也更新一下经典算法的文章 如果想一起“狂”或者交流&#xff0c;欢迎来私聊 还不快趁着这个机会来提升…

鸡尾酒排序算法详解

一、什么是鸡尾酒排序 1.概念 鸡尾酒排序算法又叫快乐小时排序&#xff0c;它基于冒泡排序算法做了一些优化。冒泡排序算法每一轮都是从左到右进行元素比较&#xff0c;进行单向的位置交换&#xff0c;鸡尾酒排序算法则是双向的元素比较和交换。 2.算法原理 这是一个无序数…

【1072】鸡尾酒疗法

1072&#xff1a;鸡尾酒疗法 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 62913 通过数: 27350 【题目描述】 鸡尾酒疗法&#xff0c;指“高效抗逆转录病毒治疗”。人们在鸡尾酒疗法的基础上又提出了很多种改进的疗法。为了验证这些治疗方法是否在疗效上比鸡尾…

把psd自动生成html,根据psd文件生成html

我是新手&#xff0c;怎样在ps中把psd文件变成html文件呢&#xff1f;我知道要用切片&#xff0c;但是具体步骤怎么做&#xff0c;还有是不是不同的ps版本有差异 不同的ps版本是没有什么差异的&#xff0c;主要用到的就是工具里面的切片&#xff0c;用切片切好图后&#xff0c;…

为什么不要相信AI机器人提供的健康信息?

自从OpenAI、微软和谷歌推出了AI聊天机器人&#xff0c;许多人开始尝试一种新的互联网搜索方式&#xff1a;与一个模型进行对话&#xff0c;而它从整个网络上学到的知识。 专家表示&#xff0c;鉴于之前我们倾向于通过搜索引擎查询健康问题&#xff0c;我们也不可避免地会向Ch…

OpenAI 用于辅助治疗的 GPT-4:AI 如何彻底改变心理健康护理

人工智能&#xff08;AI&#xff09;改变了我们生活的方方面面&#xff0c;从娱乐和教育到医疗保健。人工智能最有前途的应用之一是在心理健康领域&#xff0c;它可以帮助数百万患有抑郁症、焦虑症、创伤后应激障碍 &#xff08;PTSD&#xff09; 和物质使用障碍等各种疾病的人…

大模型惨遭人类大范围攻击!国内各领域专家组团投毒,GPT-4也Hold不住

包括GPT-4在内等多个大模型惨遭人类攻击&#xff01;还是大范围、多边形那种。 而且这个军团被爆个个来头不小。 包括社会学家李银河、心理学家李松蔚、中科院计算研究所王元卓等&#xff0c;覆盖环境、心理、法理、心理、教育、大数据、无障碍等多个领域。 他们专挑刁钻、陷…

苹果AI哪去了?前员工揭秘Siri何以走向没落:团队内耗、技术判断太谨慎

明敏 发自 凹非寺量子位 | 公众号 QbitAI 苹果为何会在最新一轮ChatGPT趋势中“静悄悄”&#xff1f; 答案更进一步浮出水面。 内部团队混乱、决策缓慢、代码笨重&#xff0c;都成为了拖累苹果AI更快前进的原因。 最直接的体现&#xff0c;可以来看Siri。 这大概是大部分普通人…

新规拉开中国生成式AI“百团大战”序幕?

AI将走向何方&#xff1f; ChatGPT在全球范围掀起的AI热潮正在引发越来越多的讨论&#xff0c;AI该如何管理&#xff1f;AI该如何发展&#xff1f;一系列问题都成为人们热议的焦点。此前&#xff0c;马斯克等海外名人就在网络上呼吁OpenAI暂停ChatGPT的模型训练和迭代&#xf…

苹果AI哪去了?前员工揭秘Siri何以走向没落:团队内耗、技术判断太谨慎!

省时查报告-专业、及时、全面的行研报告库 省时查方案-专业、及时、全面的营销策划方案库 【免费下载】2023年3月份热门报告合集 万字干货&#xff1a;ChatGPT的工作原理 2023年创业&#xff08;有创业想法&#xff09;必读手册 ChatGPT等让你效率倍增的22个AI工具 ChatGPT调研…

Mac下安装Redis 4.0(服务器端)

系统环境: CentOS 7.4 Redis版本: 4.0 这里采用终端下载解析安装: 1.1 进入/usr/local/目录 cd /usr/local/ 1.2 下载稳定版 wget http://download.redis.io/releases/redis-4.0.10.tar.gz 1.3 解压: tar -zxvf redis-4.0.10.tar.gz 1.4 进入解压后的文件中 cd redis-4.0.10 1.…

Mac下 Gradle4.0 详细安装攻略

macaca更新到2.0.0以上&#xff0c; 安卓需要使用gradle来构建app包&#xff0c;具体见Macaca 基于Python自动化测试框架搭建详解 ——Android、IOS搭建步骤&#xff0c;所以有了以下这篇文章。安装具体步骤如下&#xff1a; 
 • 下载最新的gradle的包&#xff0c;地址为&a…

mdserver(mac版) 4.0.1.0

mdserver(mac版) 4.0.1.0 Mac上高度可定制的PHP开发环境,集成必要的扩展,方便使用。 (pkg安装方式),安装方便,是你Mac上的PHP开发利器。 支持80端口。OpenResty(1.15.8.3)支持Lua开发。Redis(6.2.5),MongoDB(5.0.0),Memcached(1.6.10)。php-fpm以sock文件方式管理。多php进程…

Portraiture4.0最新免费磨皮美白滤镜修图插件

Portraiture这款老牌的一键磨皮修图插件终于更新啦&#xff01;最近官方推出了Portraiture 4.0.3版本&#xff01;新版本光影处理更强大&#xff0c;支持PS和LR软件&#xff01;&#xff01;最新版Portraiture 4.0.3插件滤镜下载安装包一PS人像精修磨皮美化修图神器&#xff0c…

pytorch gpu版本安装

正确的安装顺序 完蛋的&#xff0c;我写到现在才发现&#xff0c;由于我对于要安装的东西一知半解&#xff0c;导致我开始就被误导了&#xff0c;我首先查看了自己的cuda版本号&#xff0c;然后去安装pytorch&#xff0c;后来发现官网上pytorch都到11.6了&#xff0c;我才只有1…

【代码随想录day15】110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.左叶子之和

110.平衡二叉树 问题 题目链接&#xff1a;https://leetcode.cn/problems/balanced-binary-tree/ 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉树每个节点 的左右两个子树的高度差的绝对值…

SpringBoot自动装配串讲

目录 前言一. 基础概念1-1. Spring1-2. SpringBoot 二. 自动装配概览2-1. 效果&#xff08;目的&#xff09;2-2. 猜想2-3. SpringBoot的实现方案2-4. 对比及分析2-4-1. starter里为什么没有pom文件2-4-2. 配置类为什么没写在starter里 三. 自动装配细节3-1. 流程图3-2. 各部分…

告别抠图!海量免抠PNG,任你选

无论处理图片还是做PPT&#xff0c;经常会用到透明背景的图片素材&#xff0c;往往这种时候就需要进行抠图加 工。对PS图技术不佳的小伙伴而言&#xff0c;要抠出一张完美的图片并非易事。但也不是难事&#xff0c;只要你 有免抠PNG素材网&#xff08;搜图114 www.sotu114.co…

自己用ps抠图标

大家进入项目阶段已经有差不多一个月了&#xff1b;从简单数据库分析到慢慢的调试页面&#xff1b;再到 灵活的进行增删查改&#xff1b;相信在这一个月里大家的代码技术都有了一定的提高&#xff1b;相信对于以前学的现在是更加熟练了。对于不会的&#xff0c;可以通过网上查找…