【Java】冒泡排序

news2024/9/20 5:58:33

文章目录

  • 一、什么是冒泡排序
    • 定义
    • 冒泡思想
    • 代码实现
  • 二、冒泡排序的优化
    • 第一次优化
    • 第二次优化
  • 三、鸡尾酒排序

一、什么是冒泡排序

在这里插入图片描述

定义

冒泡排序(bubble sort)是最基础的排序算法,它是一种基础的交换排序。它的原理就像汽水一样,汽水中常常有许多小气泡飘到上面。而冒泡排序这种排序算法的每一个元素也可以像小气泡一样根据自身大小一点点地向着数组一端移动

那冒泡排序具体是如何移动的呢?

冒泡思想

对于以下这个无序的数列,用冒泡排序的思想进行排序:
在这里插入图片描述

冒泡排序的思想:相邻元素两两比较,当一个元素大于右侧相邻元素时,交换他们的位置;当一个元素小于或等于右侧元素时,位置不变。

在这里插入图片描述
当通过一轮排序之后,元素9作为最大的元素,移动到了数列的最右端。9是目前有序数列的唯一元素。

总体的排序流程如下:

在这里插入图片描述

该算法每一轮排序都需要遍历一遍所有的元素,对于8个元素的排序总共遍历了7轮,所以该算法总共需要遍历(元素数量-1)轮,平均时间复杂度为O(n2);

代码实现

import java.util.Arrays;

public class bubbleSort {
    public static void sort(int arr[]) {
        //一共进行元素个数减一轮排序
        for (int i = 0; i < arr.length - 1; i++) {
            //只需要对没有排序的进行排序
            for (int j = 0; j < arr.length - 1 - i; j++) {
                //将前一个比后一个大的两元素进行交换
                if (arr[j] > arr[j + 1]) {
                    int tmp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = tmp;
                }
            }
        }
    }

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

在这里插入图片描述

二、冒泡排序的优化

第一次优化

从刚才的排序过程中我们可以发现到第六轮排序结束的时候数列已经是有序的了,但还要进行第七轮排序。对于这种情况,我们可以在数列有序时做出一个标志,那么就不用进行多余的排序了。

public static void sort(int arr[]) {
        //一共进行元素个数减一轮排序
        for (int i = 0; i < arr.length - 1; i++) {
            //有序的标志,每轮的初始值都为true
            boolean isSorted=true;
            //只需要对没有排序的进行排序
            for (int j = 0; j < arr.length - 1 - i; j++) {
                //将前一个比后一个大的两元素进行交换
                if (arr[j] > arr[j + 1]) {
                    int tmp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = tmp;
                    //如果有元素交换,说明数列还未有序
                    isSorted=false;
                }
            }
            //如果已经有序,则结束排序
            if(isSorted){
                break;
            }
        }
    }

第二次优化

我们还可以进一步对它进行优化,对于如下这个数列:

在这里插入图片描述
第一轮排序经过两次交换后变为:

在这里插入图片描述
然后接下来元素4和5进行比较,4小于5,位置不变。
元素5和6进行比较,5小于6,位置不变。
元素6和7进行比较,6小于7,位置不变。
元素7和8进行比较,7小于8,位置不变。

第一轮排序后我们可以发现,数列后面的几个数已经是有序的了,但还要进行几次比较,白白比较了很多次,这正是可以优化的地方。

为了避免这种情况的发生,我们可以在每轮排序后记录下最后一次元素交换的位置,该位置为无序数列的边界,该位置以后为有序区。

public static void sort(int arr[]) {
        //最后一次进行元素交换的位置
        int lastExchangeIndex=0;
        //无序数列的边界,每次排序只需要到这个元素
        int sortBorder=arr.length-1;
        //一共进行元素个数减一轮排序
        for (int i = 0; i < arr.length - 1; i++) {
            //有序的标志,每轮的初始值都为true
            boolean isSorted=true;
            //只需要对没有排序的进行排序
            for (int j = 0; j < sortBorder; j++) {
                //将前一个比后一个大的两元素进行交换
                if (arr[j] > arr[j + 1]) {
                    int tmp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = tmp;
                    //如果有元素交换,说明数列还未有序
                    isSorted=false;
                    //更新最后一次交换的位置
                    lastExchangeIndex=j;
                }
            }
            sortBorder=lastExchangeIndex;
            //如果已经有序,则结束排序
            if(isSorted){
                break;
            }
        }
    }

三、鸡尾酒排序

冒泡排序都是每一轮从左到右来比较元素,进行单向的位置交换

而鸡尾酒排序每次元素的比较与交换过程是双向

在这里插入图片描述

对于以上数列,只有元素1的位置不对,但使用冒泡排序却需要进行7轮排序,鸡尾酒排序刚好可以解决这个问题。

第一轮:

第一轮与冒泡排序一样,8和1进行交换

在这里插入图片描述
第二轮:

第二轮换为从右往左进行比较交换

在这里插入图片描述
第三轮:

虽然此时已经有序,但流程还未结束,第三轮重新开始从左到右进行比较交换。
几次比较之后没有位置进行交换,排序结束。三轮就已经有序。

鸡尾酒排序第一轮从左到右,第二轮从右到左,第三轮再从左到右…直至数列有序。

public static void sort(int arr[]){
        //鸡尾酒排序每两轮会在数列两端各增加一个有序的的元素,下一轮不用再进行比较
        for (int i = 0; i < arr.length/2; i++) {
            //有序标记,初始值为true
            boolean isSorted=true;
            //奇数轮,从左向右比较交换
            for (int j = i; j < arr.length-i-1; j++) {
                if(arr[j]>arr[j+1]){
                    int tmp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=tmp;
                    //有元素交换,所以不是有序的
                    isSorted=false;
                }
            }
            //如果已经有序,则结束排序
            if(isSorted){
                break;
            }
            //偶数轮前,isSorted重新置为true
            isSorted=true;
            //偶数轮,从右向左进行比较交换
            for (int j = arr.length-i-1; j > i; j--) {
                if(arr[j]<arr[j-1]){
                    int tmp=arr[j];
                    arr[j]=arr[j-1];
                    arr[j-1]=tmp;
                    //有元素交换,所以不是有序的
                    isSorted=false;
                }
            }
            if(isSorted){
                break;
            }
        }
    }

鸡尾酒排序的优势是在大多数元素已经有序的情况下减少了排序的回合数,但缺点是代码量增加了近一倍。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue第八篇Vue3

一 Vue3的变化 1.性能的提升 打包大小减少41% 初次渲染快55%, 更新渲染快133% 内存减少54% 2.源码的升级 使用Proxy代替defineProperty实现响应式 重写虚拟DOM的实现和Tree-Shaking 3.拥抱TypeScript Vue3可以更好的支持TypeScript 4.新的特性 Composition API&#…

Leetcode---349周赛

题目列表 2733. 既不是最小值也不是最大值 2734. 执行子串操作后的字典序最小字符串 2735. 收集巧克力 2736. 最大和查询&#xff08;这题难度较大&#xff0c;等以后有时间再和大家分享&#xff09; 一、2733、既不是最小值也不是最大值 关键是看到题目中说数组中的元素不…

一文快速了解软件技术基础

前言 数据结构和算法是计算机科学的基石&#xff0c;它们为我们提供了处理和组织数据的方法和工具。通过学习数据结构&#xff0c;您将能够理解如何存储和操作不同类型的数据&#xff0c;如何优化内存使用和访问效率&#xff0c;以及如何设计高效的算法来解决各种计算问题。掌…

iOS -- isa指针

isa指针&#xff1a;isa指针是一个指向对象所属类或元类的指针。它决定了对象可以调用的方法和属性。isa指针在对象的结构中存在&#xff0c;并且在运行时会被自动设置。isa 指针&#xff0c;表示这个对象是一个什么类。而 Class 类型&#xff0c; 也就是 struct objc_class * …

XML 的命名空间及其在OPCUA中的应用

为了防止不同XML 使用的名称冲突&#xff0c;XML 规范中规定的命名空间&#xff0c;平时编写单一命名空间的XML 文档&#xff0c;没有过多地注意XML 命名空间的细节。当开发OPCUA 信息模型时&#xff0c;被命名空间搞得云里雾里。为此&#xff0c;做了一个笔记。 URI(Uniform R…

Vue3_ElementPlus_简单增删改查(2023)

Vue3&#xff0c;Element Plus简单增删改查 代码&#xff1a;https://github.com/xiaoming12318/Vue3_ElementPlus_CRUD.git 环境&#xff1a; Visual Studio Code Node.js 16.0或更高版本&#xff0c;https://nodejs.org/en axios 快速上手&#xff1a; 如果已经有16.0及…

Vue单文件组件

单文件组件 单文件组件是在开发中用的比较多的&#xff0c;它的后缀都是.vue结尾的 既然是.vue结尾&#xff0c;那么直接给浏览器是不能运行的&#xff0c;.vue文件是vue团队打造的特殊文件&#xff0c;想让.vue文件让浏览器识别并且运行&#xff0c;需要对它进行处理加工成纯…

5款大厂设计师都在用的网页设计工具

本文收集了5款大厂设计师使用的几种流行易用的网页设计工具&#xff0c;其中一个可以AI自动生成设计稿&#xff0c;非常的方便&#xff0c;相信一定有一个适合你的网页设计工具。 1.即时设计 即时设计是一款免费的在线 UI 设计工具&#xff0c;无系统限制&#xff0c;浏览器打…

三个原则判定电源环路稳定性

1 环路稳定性评价指标 衡量开关电源稳定性的指标是相位裕度和增益裕度。同时穿越频率&#xff0c;也应作为一个参考指标。 (1) 相位裕度是指&#xff1a;增益降到0dB时所对应的相位。 (2) 增益裕度是指&#xff1a;相位为0deg时所对应的增益大小(实际是衰减)。 (3) 穿越频率…

DVWA下载、安装及使用教程,网络安全小白必看!

DVWA是一款基于PHP和mysql开发的web靶场练习平台&#xff0c;集成了常见的Web漏洞。旨在为安全人员测试自己的专业技能和工具提供合法的环境&#xff0c;帮助web开发者更好的理解web应用安全防范的过程&#xff1b; 一、DVMA介绍 DVWA官网 (opens new window)DVWA Github (ope…

springboot配置文件中的巨坑!!

问题 application.yml test:password1: 030030password2: 030030使用此配置的bean Component public class Test {Value("${test.password1}")private String password1;Value("${test.password2}")private String password2;PostConstructpublic void …

企业微信建设代开发应用的基本流程及实现

一、企业微信代开发应用的基本流程 企业微信中除了系统提供的应用以及上架应用商店的第三方应用外&#xff0c;也可以使用自己开发的应用&#xff0c;不过多数企业都不具备开发能力&#xff0c;只能采用代开发的形式进行定制。就给大家分享一下企业微信代开发应用的基本流程&a…

java八股面试文(带答案,万字总结,精心打磨,建议收藏)堪称2023最强

前言 2023秋招即将来临&#xff0c;很多同学会问Java面试八股文有必要背吗&#xff1f; 我的回答是&#xff1a;很有必要。你可以讨厌这种模式&#xff0c;但你一定要去背&#xff0c;因为不背你就进不了大厂。 国内的互联网面试&#xff0c;恐怕是现存的、最接近科举考试的…

【Java项目】不使用ES实现关键词搜索问题

文章目录 需求解决思路基本设计查询流程插入流程修改流程删除流程 优化思路总结 需求 ok&#xff0c;这个需求是我提的&#xff0c;然后我问了我的一位杭州的朋友&#xff0c;然后我们最后一起敲定这个方法。 我的项目有一个根据关键字进行商品名称的搜索功能&#xff0c;用户…

安卓期末考试知识总结

文章目录 第一章&#xff1a;Android基础入门习题总结重点知识 第二章&#xff1a;Android常见桌面布局&第三章&#xff1a;Android常见界面控件知识总结习题总结 第一章&#xff1a;Android基础入门 习题总结 Android系统采用分层架构&#xff0c;由高到低分为4层&#…

MySQL数据库 --- 运维篇

一、日志 1.1、错误日志 错误日志是 MySQL 中最重要的日志之一&#xff0c;它记录了当 mysqld 启动和停止时&#xff0c;以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时&#xff0c;建议首先查看此日志。 该日志是默认开启的…

实训笔记6.12

实训笔记6.12 6.12一、座右铭二、知识回顾2.1 面向对象的两大核心概念&#xff1a;类和对象2.2 面向对象的三大特征封装性继承性多态性-必须在继承之上抽象性 2.3 面向对象的常用关键字2.4 Java设计模式中适配器模式2.4.1 接口适配器2.4.2 类适配器2.4.3 对象适配器 三、Java常…

Linux基础知识3

Linux基础知识 适合有Linux基础的人群进行复习。 禁止转载&#xff01; 用户与用户组管理 Linux系统下的3类用户和功能&#xff1b; 答&#xff1a; root用户&#xff08;或称根用户、超级用户&#xff09;&#xff1a;Linux的内置用户&#xff0c;权限最高&#xff0c;具有…

wps安装提示nsis error

1.安装时弹出「NSIS error」错误框&#xff0c;无法安装。 此问题为一般为安装包损坏导致&#xff0c;可重新下载安装包尝试安装。 我遇到的提示也是这个。文件损坏。但是换了绿色U盘&#xff08;格式是FAT32&#xff09;复制过去就能安装。 之前用白色U盘&#xff08;格式是N…

一学就会-----链表的回文结构

文章目录 题目描述思路代码示例 题目描述 对于一个链表&#xff0c;请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法&#xff0c;判断其是否为回文结构。 给定一个链表的头指针A&#xff0c;请返回一个bool值&#xff0c;代表其是否为回文结构。保证链表长度小于等于90…