冒泡排序和鸡尾酒排序

2023-11-14

传统冒泡排序。

import java.util.Arrays;

/**
 * @author 新新
 * @ClassName: BubbleSort
 * @Description: 冒泡排序
 * @date 2022年03月17日
 */
public class BubbleSort1 {

    public static void sort(int array[]) {
        for (int i = 0; i < array.length - 1; i++) {
            for (int j = 0; j < array.length - i - 1; j++) {
                int tmp = 0;
                if (array[j] > array[j + 1]) {
                    tmp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = tmp;
                }
            }
        }
    }


    public static void main(String[] args) {
        //int[] array = new int[]{2, 3, 4, 5, 9, 6, 7, 8, 1};
        //int[] array = new int[]{3, 4, 9, 2, 1, 5, 6, 7, 8};
        int[] array = new int[]{7, 2, 9, 1, 3, 8, 4, 5, 6};
        sort(array);
        System.out.println(Arrays.toString(array));
    }

}

 冒泡排序(有序区优化)。
用变量记录最后一次交换的位置。
用标识符标识出无序区与有序区界限位置,有序区内的元素不再参与比较。

import java.util.Arrays;

/**
 * @author 新新
 * @ClassName: BubbleSort
 * @Description: 冒泡排序(有序区优化)。
 * @date 2022年03月17日
 */
public class BubbleSort2 {

    /**
     * 有序区优化。
     * 用变量记录最后一次交换的位置。
     * 用标识符标识出无序区与有序区界限位置,有序区内的元素不再参与比较。
     *
     * @param array
     */
    public static void sort(int array[]) {
        //记录最后一次交换的位置。
        int lastExchangeIndex = 0;
        //无序数列的边界,每次比较只需要比到这里为止。
        int sortBorder = array.length - 1;

        for (int i = 0; i < array.length - 1; i++) {
            //有序标记,每一轮的初始值都是true。
            boolean isSorted = true;
            for (int j = 0; j < sortBorder; j++) {
                int tmp = 0;
                if (array[j] > array[j + 1]) {
                    tmp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = tmp;
                    //因为有元素进行交换,所以不是有序的,标记为false。
                    isSorted = false;
                    //更新为最后一次交换元素的位置。
                    lastExchangeIndex = j;
                }
            }

            sortBorder = lastExchangeIndex;
            if (isSorted) {
                break;
            }
        }

    }


    public static void main(String[] args) {
        //int[] array = new int[]{2, 3, 4, 5, 9, 6, 7, 8, 1};
        //int[] array = new int[]{3, 4, 9, 2, 1, 5, 6, 7, 8};
        int[] array = new int[]{7, 2, 9, 1, 3, 8, 4, 5, 6};
        sort(array);
        System.out.println(Arrays.toString(array));
    }

}

鸡尾酒排序。
第一次从左侧循环到右侧,然后再从右侧循环到左侧,这是一个大循环。
然后再从左侧循环到右侧,从右侧循环到左侧。
适用于大部分元素已经有序的情况。

import java.util.Arrays;

/**
 * @author 新新
 * @ClassName: BubbleSort
 * @Description: 鸡尾酒排序
 * @date 2022年03月17日
 */
public class CocktailSort1 {


    /**
     * 鸡尾酒排序。
     * 第一次从左侧循环到右侧,然后再从右侧循环到左侧,这是一个大循环。
     * 然后再从左侧循环到右侧,从右侧循环到左侧。
     * 适用于大部分元素已经有序的情况。
     * @param array
     */
    public static void sort(int array[]) {
        int tmp = 0;
        for (int i = 0; i < array.length / 2; i++) {
            //有序标记,每一轮的初始值都是true。
            boolean isSorted = true;
            //奇数轮,从左向右比较和交换。
            for (int j = i; j < array.length - i - 1; j++) {
                if (array[j] > array[j + 1]) {
                    tmp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = tmp;
                    //有元素交换,所以不是有序的,标记变为false。
                    isSorted = false;
                }
            }

            if (isSorted) {
                //没有元素位置变化。
                break;
            }

            //在偶数轮之前,将isSorted重新标记为true。
            isSorted = true;
            //偶数轮,从右向左比较和交换。
            for (int j = array.length - i - 1; j > i; j--) {
                if (array[j] < array[j - 1]) {
                    tmp = array[j];
                    array[j] = array[j - 1];
                    array[j - 1] = tmp;
                    //因为有元素进行交换,所以不是有序的,标记变为false。
                    isSorted = false;
                }
            }

            if (isSorted) {
                //没有元素位置变化。
                break;
            }

        }
    }


    public static void main(String[] args) {
        //int[] array = new int[]{2, 3, 4, 5, 9, 6, 7, 8, 1};
        //int[] array = new int[]{3, 4, 9, 2, 1, 5, 6, 7, 8};
        int[] array = new int[]{7, 2, 9, 1, 3, 8, 4, 5, 6};
        sort(array);
        System.out.println(Arrays.toString(array));
    }

}

 

鸡尾酒排序(有序区优化)。
第一次从左侧循环到右侧,然后再从右侧循环到左侧,这是一个大循环。
然后再从左侧循环到右侧,从右侧循环到左侧。
适用于大部分元素已经有序的情况。

有序区优化。
用变量记录最后一次交换的位置。
用标识符标识出无序区与有序区界限位置,有序区内的元素不再参与比较。

import java.util.Arrays;

/**
 * @author 新新
 * @ClassName: BubbleSort
 * @Description: 鸡尾酒排序(有序区优化)。
 * @date 2022年03月17日
 */
public class CocktailSort2 {


    /**
     * 鸡尾酒排序。
     * 第一次从左侧循环到右侧,然后再从右侧循环到左侧,这是一个大循环。
     * 然后再从左侧循环到右侧,从右侧循环到左侧。
     * 适用于大部分元素已经有序的情况。
     *
     * 有序区优化。
     * 用变量记录最后一次交换的位置。
     * 用标识符标识出无序区与有序区界限位置,有序区内的元素不再参与比较。
     *
     * @param array
     */
    public static void sort(int array[]) {
        //记录从左到右的循环最后一次交换的位置。
        int lastRightExchangeIndex = 0;
        //记录从右到左的循环最后一次交换的位置。
        int lastLeftExchangeIndex = 0;

        //标识符,无序数列的边界,每次从左到右比较只需要比到这里为止。
        int rightSortBorder = array.length - 1;
        //标识符,无序数列的边界,每次从右到左比较只需要比到这里为止。
        int leftSortBorder = 0;

        int tmp = 0;
        //控制所有排序回合。
        for (int i = 0; i < array.length / 2; i++) {
            //有序标记,每一轮的初始值都是true。
            boolean isSorted = true;
            //奇数轮,从左向右比较和交换元素。
            for (int j = i; j < rightSortBorder; j++) {
                if (array[j] > array[j + 1]) {
                    tmp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = tmp;
                    //有元素交换,所以不是有序的,标记变为false。
                    isSorted = false;
                    //更新为最后一次交换元素的位置。
                    lastRightExchangeIndex = j;
                }
            }
            rightSortBorder = lastRightExchangeIndex;
            if (isSorted) {
                //没有元素位置变化。
                break;
            }


            //在偶数轮之前,将isSorted重新标记为true。
            isSorted = true;
            //偶数轮,从右向左比较和交换元素。
            for (int j = array.length - i - 1; j > leftSortBorder; j--) {
                if (array[j] < array[j - 1]) {
                    tmp = array[j];
                    array[j] = array[j - 1];
                    array[j - 1] = tmp;
                    //因为有元素进行交换,所以不是有序的,标记变为false。
                    isSorted = false;
                    //更新为最后一次交换元素的位置。
                    lastLeftExchangeIndex = j;
                }
            }
            leftSortBorder = lastLeftExchangeIndex;
            if (isSorted) {
                //没有元素位置变化。
                break;
            }

        }
    }


    public static void main(String[] args) {
        //int[] array = new int[]{2, 3, 4, 5, 9, 6, 7, 8, 1};
        //int[] array = new int[]{3, 4, 9, 2, 1, 5, 6, 7, 8};
        int[] array = new int[]{7, 2, 9, 1, 3, 8, 4, 5, 6};
        sort(array);
        System.out.println(Arrays.toString(array));
    }

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

冒泡排序和鸡尾酒排序 的相关文章

  • 在 Eclipse 中隐藏重复的工具栏项

    我不知道如何 但我的 STS 有重复的工具栏项目 我不知道如何删除它们 这是我复制的工具栏的样子 我想摆脱这些 我试图隐藏工具栏 但这没有帮助 有人知道如何删除重复的吗 自从升级到 Oxygen 以来 我一直遇到同样的问题 我无法可靠地重现
  • 从 BroadcastReceiver 获取方法来更新 UI

    我正在尝试根据变量的变化更新用户界面BroadcastReceiver 因此 我需要调用一个扩展类的方法 以获取我提到的变量 BroadcastReceiver in MainActivity取决于但我无法以任何方式获得真正的返回值 扩展的
  • HttpSession 内的同步是否可行?

    UPDATE 问题后立即解决 问题 通常 同步是在 JVM 内序列化并行请求 例如 private static final Object LOCK new Object public void doSomething synchroniz
  • Android CursorAdapter、ListView 和后台线程

    我一直在开发的这个应用程序有包含数兆字节数据的数据库可供筛选 许多活动只是列表视图 通过数据库中的各个级别的数据下降 直到到达 文档 即从数据库中提取并显示在手机上的 HTML 我遇到的问题是 其中一些活动需要能够通过捕获击键并重新运行带有
  • Java HashMap 嵌套泛型与通配符

    我正在尝试创建包含自定义类的不同子类的哈希集的哈希映射值的哈希映射 如下所示 HashMap
  • 如何停止使用扫描仪从标准输入读取多行?

    我正在做一个 JAVA 作业 应该处理多行输入 指令显示 输入是从标准输入读取的 给出了示例输入的示例 one 1 two 2 three 3 我不明白上面的示例输入 从标准输入读取 是什么意思 这是我编写的一个测试程序 它可以消除我的困惑
  • 想要从java中的char数组创建字符流

    我想从 char 数组构造一个流以使用 java 8 功能 例如过滤器和映射 char list a c e Stream
  • AWS SDK 2 承担角色

    Bean public DynamoDbClient amazonDynamoDB final AssumeRoleRequest assumeRoleRequest AssumeRoleRequest builder roleSessio
  • Apache Commons VFS - 无法解析文件

    VFS 方法无法处理此 URI jboss server temp dir local outgoing配置在jboss beans xml这是决心 C Download jboss eap 5 1 1 server default tmp
  • Java:不使用 Arrays.sort() 对整数数组进行排序

    这是我们 Java 课程的练习之一中的说明 首先 我想说我 做了我的功课 我不仅仅是懒惰地请 Stack Overflow 上的人帮我回答这个问题 在所有其他练习中 这个特定项目一直是我的问题 因为我一直在努力寻找 完美的算法 编写JAVA
  • 如何构建和使用 TimeSeriesCollections

    我想在图表的 X 轴上显示一些日期 并且here https stackoverflow com questions 5118684 jfreechart histogram with dates据说我必须使用 TimeSeriesColl
  • Hazelcast:连接到远程集群

    我们有一组 Hazelcast 节点 全部运行在一个远程系统 具有许多节点的单个物理系统 上 我们希望从外部客户端连接到该集群 一个 Java 应用程序 它使用如下代码连接到 Hazelcast ClientConfig clientCon
  • 单元测试、集成测试还是设计中的问题?

    我编写了我的第一个单元测试 我认为它过于依赖其他模块 我不确定是否是因为 这是一个复杂的测试 我实际上已经编写了集成测试或 我的设计有问题 我首先要说的是 虽然我有大约 4 年的开发经验 但我从未学过 也没有人教过自动化测试 我刚刚使用 H
  • 如何从 Trie 中检索给定长度的随机单词

    我有一个简单的 Trie 用来存储大约 80k 长度为 2 15 的单词 它非常适合检查字符串是否是单词 但是 现在我需要一种获取给定长度的随机单词的方法 换句话说 我需要 getRandomWord 5 来返回 5 个字母的单词 所有 5
  • Java 常量枚举[重复]

    这个问题在这里已经有答案了 可能的重复 理解 Java 中的枚举 https stackoverflow com questions 1419835 understanding enums in java 为什么我们应该使用枚举而不是 Ja
  • 如何加载图像文件到ImageView?

    我试图在从文件选择器中选择图像文件后立即显示该图像文件 文件选择器仅限于 png 和 jpg 文件 所选文件存储在文件类型的变量中 为此 我设置了一个 ImageView 我希望用这个新文件设置图像 唯一的问题是它的类型是文件而不是图像 如
  • 应用程序中空指针异常[重复]

    这个问题在这里已经有答案了 我正在尝试在我的应用程序中实施应用程序内计费 我写了这段代码 public class Settings extends PreferenceFragment ServiceConnection mService
  • 从特定 JAR 文件读取资源(文件的重复路径)

    假设您有 jar1 和artifactId 动物园 jar2 和artifactId 动物 两个 jar 都有一个具有相同路径的资源文件 例如 animals animal txt 有什么方法可以从特定的 jar 中读取该文件吗 使用 ge
  • 如何让JComboBox中的内容居中显示?

    目前我有这个JComboBox 我怎样才能将其中的内容居中 String strs new String 15158133110 15158133124 15158133458 JComboBox com new JComboBox str
  • Swing:创建可拖动组件...?

    我在网上搜索了可拖动 Swing 组件的示例 但我发现示例不完整或不起作用 我需要的是一个摇摆组件那可以是dragged通过鼠标 在另一个组件内 被拖拽的时候 应该已经 改变它的位置 而不仅仅是 跳 到目的地 我很欣赏无需非标准 API 即

随机推荐

  • 如何不借助新的变量交换两个变量的值

    在很多问题的解决中都会遇到 需要交换两个变量的值 这种情况 下面的方法 三变量法 想必是大家常用的吧 include
  • 【数据结构与算法】内排序算法全解析(附C语言代码)

    导览 0 预备知识 0 1 排序的概念 0 2 排序的稳定性 0 3 内排序与外排序 0 4 排序算法的性能 0 5 常见排序算法的性能 1 比较排序 1 1 插入排序 1 1 1 直接插入排序 1 1 2 折半插入排序 1 1 3 希尔排
  • Redis缓存与数据库的双写一致性(先更新数据库再删除缓存并结合RabbitMQ消息队列)

    实现双写一致性 通常会选择先更新数据库 然后再删除缓存的策略 并结合 RabbitMQ 的消息队列机制 主要有以下几个原因 保证数据一致性 在应用程序中 同一个数据可能存在于多个缓存服务节点中 这样会对数据的一致性造成很大影响 为了避免出现
  • JAVASE 注解与反射

    注解与反射都是框架的基础 注解 注解的格式 注释名 参数名 参数值 可以使用在 package class method field上 作为辅助信息 内置注解 Override 重写方法 会检测方法名称 Deprecated 表明该方法已过
  • 2013年春季学期最佳博客内容奖评选开始啦

    各位亲爱的俱乐部主席们 大家好啊 暑假来啦 CSDN高校俱乐部的福利也来啦 首先感谢你们为高校俱乐部的工作所付出的一切努力 从高校俱乐部的首页改版之后起 大家开始使用博客来记录自己俱乐部的工作内容 并且向俱乐部会员和主席们分享自己的学习生活
  • 魅族mx4服务器无响应,魅族MX4刷机失败解决方法

    2014 12 23 10 25 24 魅族MX4刷机失败解决方法 标签 魅族MX4 魅族MX4刷机教程 魅族MX4刷机失败 魅族MX4ROM 对于很多魅族 MX4的新手 对刷机不太了解 很容易导致刷机失败 那么魅族 MX4刷机失败应该如何
  • xshell连接时显示“服务器发送了一个意外的数据包。received:3,expected:20“问题的解决方法

    最近安装了openbsd6 7版本 安装完后通过xshell连接 弹出一个错误对话框 提示 服务器发送了一个意外的数据包 received 3 expected 20 的错误信息 检查sshd服务是正常开启的 防火墙也没阻止 奇怪了 我又重
  • pandas ExcelWriter定制格式(定制表头、渲染颜色等,非ExcelWriter标准的创建模式)...

    2019独角兽企业重金招聘Python工程师标准 gt gt gt ExcelWriter这个插件有个坑 就是已经设置好的格式是无法更改 原因详见这里 的 而且有如下问题 1 无法分别给一个单元格写入值和样式 对于单个单元格 必须在写入值的
  • 逆序数组(递归和非递归)(详细)

    逆序数组 递归和非递归 一 非递归 二 递归 一 非递归 思路 将第一个元素和最后一个元素交换 再将第二个元素和倒数第二个元素交换 直到所有元素全部交换 假设有一个数组arr abcdef 我们令它的第一个元素为arr left 最后一个元
  • 个人网页制作 大学生个人网页设计 个人网站模板 简单静态HTML个人网页作品 HTML+CSS+JavaScript

    HTML5期末大作业 个人网站设计 明星汉良 7页 带轮播特效 HTML CSS JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 web学生网页设计作业源码 常见网页设计作业题材有 个人 美食 公司 学校 旅游
  • 从软件工程的角度写机器学习5——SVM(支持向量机)实现

    SVM实现 SVM在浅层学习时代是主流监督学习算法 在深度学习时代也往往作为最后一个预测层使用 说深度学习击败了SVM的纯属扯淡 SVM算法总体流程 本系列文章旨在讲解机器学习算法的工程实现方法 不在于推导数学原理 因此想深入了解原理的请移
  • Ora 28547连接服务器失败,可能是Oracle Net 管理错误问题详解(可能是最简单的)

    最近开始学Oracle了 然后安装过程中出现了很多问题 在这就不说了 其实是当时没有保留证据 课上老师说这玩意运气不好了可能一天都装不好 当时我不信 现在我信了 废话不多说 进入正题吧 首先放图 遇到这个问题我首先去找了很多博客 大多数都是
  • QT BUG解决:QMetaObject::connectSlotsByName: No matching signal for xxxxxxxxx

    QT BUG解决 QMetaObject connectSlotsByName No matching signal for xxxxxxxxx 问题描述 采用右键 转到槽 的功能生成的槽函数无法连接到信号 此时会报错该槽没有信号对应 QM
  • Bash编程语法

    变量 a 10 定义一个变量 echo a 输出变量a unset a 删除变量a readonly b b变量只读 只读变量不能删除 字符串 name asdsdsd 拼接字符串 name2 hello name 数组 arrayname
  • 快速序列化组件MessagePack介绍

    简介 MessagePack for C MessagePack CSharp 是用于C 的极速MessagePack序列化程序 比MsgPack Cli快10倍 与其他所有C 序列化程序相比 具有最好的性能 MessagePack for
  • arduino 智能车组装步骤_Arduino智能小车硬件安装说明

    1 工具准备 安装过程中可能用到以下工具 请提前准备好 2 小车地盘组装 按小车底盘组装说明组装小车底盘 说明截图如下 三 安装船型开关及电池盒 如下图 船型开关从底部按进 两侧引出电源开关线 电池盒如图安装 电池盒红线 正极 接船型开关
  • Qt SVG Viewer Example 看看看~

    Qt提供在widgets和其他paint device上渲染和展示SVG的类 本例就允许用户载入SVG文件并在QGraphicsView上用QGraphicsSvgItem显示它 并且例子还可以选择渲染者 QGraphicsView可以用Q
  • 【华为OD】

    华为OD试题注意事项 使用合适的编程语言 在华为OD机试中多数情况下使用C 或Java 按照题目要求进行编码 仔细阅读题目描述并理解要求 在编码前可以进行伪代码编写或画流程图有助于理解和排除逻辑错误 注意代码的规范性 注重代码的可读性和可维
  • vulnhub-Kioptrix2014靶场

    以下演示在测试环境进行 遵纪守法 靶场下载地址Kioptrix 2014 5 VulnHub 看网上都说这个靶场 在下载之后运行前 需要将靶场默认网卡卸载 之后再重新添加网卡 不然获取不到IP 本着听人劝 吃饱饭原则 安装前辈经验操作 信息
  • 冒泡排序和鸡尾酒排序

    传统冒泡排序 import java util Arrays author 新新 ClassName BubbleSort Description 冒泡排序 date 2022年03月17日 public class BubbleSort1