当前位置: 首页 > news >正文

冒泡排序/鸡尾酒排序

冒泡排序

冒泡排序(Bubble Sort)是一种简单的排序算法,它通过多次交换相邻元素的位置来实现排序。它的基本思想是从数组的第一个元素开始,比较相邻的两个元素,如果它们的顺序错误,则交换它们的位置。重复进行这个过程,直到整个数组排序完成。

以下是冒泡排序的一种常见的Java实现:

public class BubbleSort {public static void bubbleSort(int[] array) {int n = array.length;for (int i = 0; i < n - 1; i++) {for (int j = 0; j < n - i - 1; j++) {if (array[j] > array[j + 1]) {// 交换相邻元素的位置int temp = array[j];array[j] = array[j + 1];array[j + 1] = temp;}}}}public static void main(String[] args) {int[] array = {64, 34, 25, 12, 22, 11, 90};bubbleSort(array);System.out.println("Sorted array: " + Arrays.toString(array));}
}

这段代码演示了冒泡排序算法的实现。在bubbleSort()方法中,使用两个嵌套的循环来遍历数组并比较相邻元素的大小。如果前一个元素大于后一个元素,则进行交换。通过不断交换,较大的元素会逐渐“冒泡”到数组的末尾。外层循环控制排序的轮数,内层循环进行具体的比较和交换操作。

最后,在main()方法中,我们创建一个示例数组并调用bubbleSort()方法对其进行排序。然后打印出排序后的数组。

冒泡排序的时间复杂度为O(n^2),其中n是数组的大小。虽然冒泡排序在性能上不如其他高效的排序算法,但是由于其实现简单,适用于小规模的数据排序。

除了上述的常见实现外,还可以对冒泡排序进行优化,例如设置一个标志位来判断某一轮是否有元素交换,如果没有交换,则说明数组已经有序,可以提前结束排序。也可以针对特定情况进行优化,比如在已经有序的部分不再进行比较。这些优化可以减少一些不必要的比较和交换操作,提高排序效率。

public class BubbleSort {public static void bubbleSort(int[] array) {int n = array.length;boolean swapped;for (int i = 0; i < n - 1; i++) {swapped = false;for (int j = 0; j < n - i - 1; j++) {if (array[j] > array[j + 1]) {// 交换相邻元素的位置int temp = array[j];array[j] = array[j + 1];array[j + 1] = temp;swapped = true;}}// 如果某一轮没有进行元素交换,则说明数组已经有序,提前结束排序if (!swapped) {break;}}}public static void main(String[] args) {int[] array = {64, 34, 25, 12, 22, 11, 90};bubbleSort(array);System.out.println("Sorted array: " + Arrays.toString(array));}
}

在这个优化版本的冒泡排序中,我们引入了一个名为swapped的标志位。在每一轮的比较过程中,如果有元素交换,则将swapped设置为true。如果某一轮没有进行元素交换,说明数组已经有序,可以提前结束排序。

通过引入标志位,可以避免在已经有序的情况下进行不必要的比较和交换操作,从而提高了冒泡排序的效率。

请注意,在最坏情况下,即输入数组完全逆序的情况下,优化后的冒泡排序的时间复杂度仍然是O(n^2)。优化的作用是在部分有序的情况下,减少了比较和交换的次数,提高了效率。

冒泡排序的多种Java实现可以根据具体的优化策略和需求进行调整和扩展,以满足特定场景下的排序需求。

鸡尾酒排序

鸡尾酒排序(Cocktail Sort),也称为双向冒泡排序(Bidirectional Bubble Sort)或定向冒泡排序(Shaker Sort),是冒泡排序的一种变体。它在排序过程中来回地在待排序序列中进行扫描和交换,以实现排序。

鸡尾酒排序的基本思想是从序列的起始位置开始,通过比较相邻元素的大小并交换它们的位置,将较大的元素逐渐“冒泡”到序列的末尾。然后,从序列的末尾开始,反向进行相同的操作,将较小的元素逐渐“冒泡”到序列的起始位置。通过来回扫描和交换的过程,逐渐缩小待排序序列的范围,直到整个序列排序完成。

以下是鸡尾酒排序的算法描述:

  1. 初始化两个指针leftright,分别指向待排序序列的起始位置和末尾位置。
  2. 进行以下循环,直到left不再小于right为止:
    • 从左到右遍历序列,比较相邻元素的大小,如果前一个元素大于后一个元素,则交换它们的位置。
    • right指针向左移动一位,缩小待排序序列的范围。
    • 从右到左遍历序列,比较相邻元素的大小,如果前一个元素大于后一个元素,则交换它们的位置。
    • left指针向右移动一位,缩小待排序序列的范围。
  3. 完成排序后,序列中的元素按照从小到大的顺序排列。

以下是使用Java编写的鸡尾酒排序算法实现:

public class CocktailSort {public static void cocktailSort(int[] array) {int n = array.length;int left = 0;int right = n - 1;boolean swapped;while (left < right) {swapped = false;// 从左到右遍历,将较大的元素冒泡到末尾for (int i = left; i < right; i++) {if (array[i] > array[i + 1]) {swap(array, i, i + 1);swapped = true;}}right--;// 从右到左遍历,将较小的元素冒泡到起始位置for (int i = right; i > left; i--) {if (array[i] < array[i - 1]) {swap(array, i, i - 1);swapped = true;}}left++;// 如果某一轮没有进行元素交换,则说明数组已经有序,提前结束排序if (!swapped) {break;}}}private static void swap(int[] array, int i, int j) {int temp = array[i];array[i] = array[j];array[j] = temp;}public static void main(String[] args) {int[] array = {64, 34, 25, 12, 22, 11, 90};cocktailSort(array);System.out.println("Sorted array: " + Arrays.toString(array));}
}

在上述代码中,我们使用leftright两个指针来分别表示待排序序列的起始位置和末尾位置。通过不断地在序列中来回进行扫描和交换操作,可以逐渐将最大和最小的元素移动到正确的位置上。在每一轮的遍历过程中,如果没有进行元素交换,说明序列已经有序,可以提前结束排序。

请注意,鸡尾酒排序的时间复杂度也是O(n^2),其中n是数组的大小。虽然鸡尾酒排序相比于传统的冒泡排序在某些情况下能够提升效率,但它仍然是一种相对较慢的排序算法。因此,在实际应用中,如果需要排序大规模数据,通常会选择效率更高的排序算法,如快速排序或归并排序。

相关文章:

冒泡排序/鸡尾酒排序

冒泡排序 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法&#xff0c;它通过多次交换相邻元素的位置来实现排序。它的基本思想是从数组的第一个元素开始&#xff0c;比较相邻的两个元素&#xff0c;如果它们的顺序错误&#xff0c;则交换它们的位置。重复进…...

代码随想录算法训练营第五十三天|309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费

代码随想录算法训练营第五十三天|309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费 309.最佳买卖股票时机含冷冻期714.买卖股票的最佳时机含手续费 309.最佳买卖股票时机含冷冻期 题目链接&#xff1a;309.最佳买卖股票时机含冷冻期 文章链接 状态&#xff1a;有…...

【Docker】Docker的使用案例以及未来发展、Docker Hub 服务、环境安全、容器部署安全

作者简介&#xff1a; 辭七七&#xff0c;目前大二&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…...

qt qtabwidget获取当前选项卡的所有按键

要获取当前选项卡中的所有按键&#xff0c;可以通过以下步骤进行&#xff1a; 通过currentIndex()函数获取当前选项卡的索引。 使用widget()函数获取当前选项卡的QWidget。 连接QWidget的keyPressEvent事件&#xff0c;并在事件处理函数中获取按下的按键信息。 下面是示例代…...

为什么Excel插入图片不显示,点击能够显示

很久没有Excel了&#xff0c;今天在做Excel表格时&#xff0c;发现上传图片后不能显示&#xff0c;但是点击还是能够出现图片的 点击如下 点击能看到&#xff0c;但是不显示&#xff1f; 最后发现只需鼠标右键点击浮动即可显示...

使用Python创建faker实例生成csv大数据测试文件并导入Hive数仓

文章目录 一、Python生成数据1.1 代码说明1.2 代码参考 二、数据迁移2.1 从本机上传至服务器2.2 检查源数据格式2.3 检查大小并上传至HDFS 三、beeline建表3.1 创建测试表并导入测试数据3.2 建表显示内容 四、csv文件首行列名的处理4.1 创建新的表4.2 将旧表过滤首行插入新表 一…...

qml基础语法

文章目录 基础语法例子 属性例子 核心元素元素item RectangleText例子 Image例子 MouseArea例子Component&#xff08;组件&#xff09;例子简单变换例子 定位器ColumnRowGridFlowRepeater 布局InputKeys 基础语法 QML是一种用于描述对象如何相互关联的声明式语言。  QtQuick是…...

数据结构 - 2(顺序表10000字详解)

一&#xff1a;List 1.1 什么是List 在集合框架中&#xff0c;List是一个接口&#xff0c;继承自Collection。 Collection也是一个接口&#xff0c;该接口中规范了后序容器中常用的一些方法&#xff0c;具体如下所示&#xff1a; Iterable也是一个接口&#xff0c;Iterabl…...

05在IDEA中配置Maven的基本信息

配置Maven信息 配置Maven家目录 每次创建Project工程后都需要设置Maven家目录位置&#xff0c;否则IDEA将使用内置的Maven核心程序和使用默认的本地仓库位置 一般我们配置了Maven家目录后IDEA就会自动识别到conf/settings.xml配置文件和配置文件指定的本地仓库位置创建新的P…...

基于IDEA 配置Maven环境和JDK版本(全局)

1.首先启动IDEA&#xff0c;进去初始界面 选择 Customize 之后&#xff0c;选择 All settings 2. 选择下图中的列表配置 3. 找到Maven下的Runner, 配置JRE的版本&#xff0c;选择自己下载使用的jdk的版本即可 4.最后配置Compiler 下的 Java Compiler 选择自己的jdk版本号&am…...

mysql数据库 windows迁移至linux

1.打开navicat&#xff0c;选择一个数据库进行操作&#xff1a; 之后文件会保存为一个xxx.sql文件&#xff0c;之后打开xftp&#xff0c;把生成的sql放进一个文件夹中(/home/dell/linuxmysql)&#xff1a; 之后登录mysql数据库&#xff0c;并创建一个新的数据库&#xff0c;然后…...

P4491 [HAOI2018] 染色

传送门:洛谷 解题思路: 写本题需要知道一个前置知识: 假设恰好选 k k k个条件的方案数为 f ( k ) f(k) f(k);先钦定选 k k k个条件,其他条件无所谓的方案数为 g ( k ) g(k) g(k) 那么存在这样的一个关系: g ( k ) ∑ i k n C i k f ( i ) g(k)\sum_{ik}^nC_{i}^kf(i) g(k)…...

12096 - The SetStack Computer (UVA)

题目链接如下&#xff1a; Online Judge 这道题我一开始的思路大方向其实是对的&#xff0c;但细节怎么实现set到int的哈希没能想清楚&#xff08;没想到这都能用map&#xff09;。用set<string>的做法来做&#xff0c;测试数据小的话答案是对的&#xff0c;但大数据时…...

Pygame中将鼠标形状设置为图片2-1

在Pygame中利用Sprite类的派生类将鼠标形状设置为图片&#xff0c;其原理就是将Sprite类的派生类对应图片的位置设置为鼠标的当前位置即可。其效果如图1所示。 图1 将鼠标设置为图片 从图1可以看出&#xff0c;鼠标的形状变为红色的&#xff0c;该红色的随着鼠标的移动而移动&…...

Vue3 + Nodejs 实战 ,文件上传项目--实现图片上传

目录 技术栈 1. 项目搭建前期工作(不算太详细) 前端 后端 2.配置基本的路由和静态页面 3.完成图片上传的页面&#xff08;imageUp&#xff09; 静态页面搭建 上传图片的接口 js逻辑 4.编写上传图片的接口 5.测试效果 结语 博客主页&#xff1a;専心_前端,javascript,mys…...

linux C++ vscode连接mysql

1.linux使用Ubuntu 2.Ubuntu安装vscode 2.1 安装的是snap版本,直接打开命令行执行 sudo snap install --classic code 3.vscode配置C 3.1 直接在扩展中搜索C安装即可 我安装了C, Chinese, code runner, 安装都是同理 4.安装mysql sudo apt update sudo apt install mysql-…...

[资源推荐]langchain、LLM相关

之前很多次逛github或者去B站看东西或者说各种浏览资讯的情况&#xff0c;都会先看两眼然后收藏然后就吃灰的情况&#xff0c;那既然这样&#xff0c;不如多看几眼&#xff0c;看看是否真的能用得上&#xff0c;能用在哪&#xff0c;然后用几句话总结出来&#xff0c;分享出来&…...

hdfs笔记

1.HDFS shell 1.0查看帮助 hadoop fs -help <cmd> 1.1上传 hadoop fs -put <linux上文件> <hdfs上的路径> 1.2查看文件内容 hadoop fs -cat <hdfs上的路径> 1.3查看文件列表 hadoop fs -ls / 1.4…...

java_方法引用和构造器引用

文章目录 一、方法引用1.1、方法引用的理解1.2、格式1.3、举例 二、构造器引用2.1、格式2.2、例子2.3、数组引用 一、方法引用 1.1、方法引用的理解 方法引用&#xff0c;可以看做是基于lambda表达式的进一步刻画当需要提供一个函数式接口的实例时&#xff0c;可以使用lambda…...

Flink Log4j 2.x使用Filter过滤日志类型

Flink Log4j 2.x使用Filter过滤日志类型&#xff08;区别INFO、ERROR&#xff09; 文章目录 Flink Log4j 2.x使用Filter过滤日志类型&#xff08;区别INFO、ERROR&#xff09;ThresholdFilterLevelMatchFilter 日志级别&#xff1a; ALL < TRACE < DEBUG < INFO < …...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...