排序算法之鸡尾酒排序

原文:微信公众号:程序员小灰——什么是鸡尾酒排序

1 鸡尾酒排序

鸡尾酒排序是冒泡排序的一种变形。它与冒泡排序的不同之处在于排序时是以双向在序列中进行排序。

2 原理

鸡尾酒排序的原理跟冒泡排序差不多,只不过冒泡排序每一轮的比较都是从左至右依次比较,而鸡尾酒排序则是一轮从左至右比较,下一轮从右至左比较。

假如有一个这样的数组:{2, 3, 4, 5, 6, 7, 8, 1},如果按照冒泡排序的比较方式,会是这样的流程:

可以看到其实每次移动的只是元素 1,如果按照冒泡排序的原理,一共需要进行 7 轮比较,显然这是可以进行优化的,在第 1 轮比较后,第 2 轮则从右至左比较,将最小的元素交换到最左侧,这样就可以减少比较的总次数:

3 代码实现

    public static int[] cockTailSort1(int[] origin) {if (origin == null || origin.length == 0) {return new int[]{};}System.out.println("origin--->" + Arrays.toString(origin));int index = 0;for (int i = 0; i < origin.length - 1; i++) {boolean isSorted = true;if (i % 2 == 0) {for (int j = 0; j < origin.length - i - 1; j++) {if (origin[j] > origin[j + 1]) {int temp = origin[j];origin[j] = origin[j + 1];origin[j + 1] = temp;isSorted = false;}index++;}} else {for (int j = origin.length - i - 1; j > 0; j--) {if (origin[j - 1] > origin[j]) {int temp = origin[j - 1];origin[j - 1] = origin[j];origin[j] = temp;isSorted = false;}index++;}}System.out.println("第" + (i + 1) + "次比较后" + "--->" + Arrays.toString(origin) + ",isSorted--->" + isSorted);if (isSorted) {break;}}System.out.println("index--->" + index);System.out.println("sortedArray--->" + Arrays.toString(origin));return origin;}

使用测试代码运行一遍:

    @Testpublic void testCockTailSort1() {// int[] intArray = new int[10];// for (int i = 0; i < intArray.length; i++) {// intArray[i] = new Random().nextInt(100);// }int[] intArray = new int[]{2, 3, 4, 5, 6, 7, 8, 1};cockTailSort1(intArray);}

运行结果如下:

可以看到相较于冒泡排序,总的比较次数已经从 8 次减少到了 3 次。

4 优化

同样,鸡尾酒排序也可以像冒泡排序一样进行优化,记录左右比较位置,减少内循环次数:

    public static int[] cockTailSort(int[] origin) {if (origin == null || origin.length == 0) {return new int[]{};}// 记录右侧最后一次交换的位置int lastRightExchangeIndex = 0;// 记录左侧最后一次交换的位置int lastLeftExchangeIndex = 0;// 无序数列的右边界,每次比较只需要比到这里为止int rightSortBorder = origin.length - 1;// 无序数列的左边界,每次比较只需要比到这里为止int leftSortBorder = 0;System.out.println("origin--->" + Arrays.toString(origin));int index = 0;for (int i = 0; i < origin.length - 1; i++) {boolean isSorted = true;if (i % 2 == 0) {System.out.print("从 " + leftSortBorder + " 比较到 " + rightSortBorder + ",");for (int j = leftSortBorder; j < rightSortBorder; j++) {if (origin[j] > origin[j + 1]) {int temp = origin[j];origin[j] = origin[j + 1];origin[j + 1] = temp;isSorted = false;lastRightExchangeIndex = j;}index++;}} else {System.out.print("从 " + rightSortBorder + " 比较到 " + leftSortBorder + ",");for (int j = rightSortBorder; j > leftSortBorder; j--) {if (origin[j] < origin[j - 1]) {int temp = origin[j];origin[j] = origin[j - 1];origin[j - 1] = temp;isSorted = false;lastLeftExchangeIndex = j;}index++;}}leftSortBorder = lastLeftExchangeIndex;rightSortBorder = lastRightExchangeIndex;System.out.println("第" + (i + 1) + "次比较后" + "--->" + Arrays.toString(origin) + ",isSorted--->" + isSorted);if (isSorted) {break;}}System.out.println("index--->" + index);System.out.println("sortedArray--->" + Arrays.toString(origin));return origin;}

运行结果如下:

5 总结

时间复杂度

同冒泡排序,假设原始数组长度为 n,则外循环 n 次,每次遍历嵌套一个内循环,所以时间复杂度为 O(n²)。

空间复杂度

同冒泡排序,空间复杂度为 O(1)。

优点

1.在某些特定情况下,鸡尾酒排序相较于冒泡排序可以减少大量比较轮数,算是冒泡排序的一种优化。

缺点

1.代码量相较于冒泡排序增加了几乎一倍。

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

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

相关文章

算法:鸡尾酒排序

双向冒泡排序也被称为鸡尾酒排序、鸡尾酒调酒器排序、摇床排序、涟漪排序、洗牌排序、班车排序等。&#xff08;再多再华丽丽的名字也难以弥补它的低效&#xff09; 鸡尾酒排序&#xff0c;是冒泡排序的改良大部分元素都有序的时候&#xff0c;可以用鸡尾酒排序、地精排序 冒泡…

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

目录 首先来看一道经典的问题&#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…