冒泡排序,详详解解

目录

基本概念:  

上图:

核心思路:

基本步骤:

关键:

代码核心:

补充:

代码(规范) :

代码(优化):


今天我们不刷力扣了,我们来复习(手撕)一下数据结构中的八大排序算法之一,冒泡排序

基本概念:  

所谓的冒泡排序,即通过对待排序序列从前向后(从下标较小的元素开始),依次对相邻两个元素的值进行两两比较,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就如果水底下的气泡一样逐渐向上冒。

上图:

核心思路:

对一组数字进行重复遍历,两两相邻进行比较,若前者比后者大则交换位置,直到所有数字呈现升序即从小到大。

基本步骤:

 1.首先比较相邻的元素,即若第一位元素大于第二位,则将前后两个元素进行交换

 2.接着从左到右依次比较,第一轮排序后,最大元素在最后,第二轮排序后,第二大元素在倒数第二,依次类推,最后直到所有元素在合适的大小位置

关键:

设总的元素个数为n,那么由上边的排序过程可以看出:

(1)总计需要进行(n-1)轮排序,也就是(n-1)次大循环

(2)每轮排序比较的次数逐轮减少

(3)每比较一轮就会有一个较大的元素排在后面,即下一轮需要比较的元素个数-1。

代码核心:

这里代码不是规范的写法,但这是冒泡排序算法的核心代码部分

 int arr[] = {3,2,7,4,1}; //定义一个数组用于存储数据和排序  int temp;//临时变量// 注意:这里有两层循环//第一层正常的从0开始遍历数组,这里记录 比较的轮数,也是不需要参加当前比较的元素个数for (int i = 0; i < arr.length-1; i++) {//第二层,比较的元素个数-i,即不需要参加当前比较的元素个数for (int j = 0; j < arr.length-1-i; j++){//这里判断如果前者大于后者就互相交换位置if (arr[j]>arr[j+1]){temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}

补充:

简单理解。第一层循环是记录总的比较轮数,而第二层 是记录具体每轮比较的元素个数 

代码(规范)

public class Sort {public static void main(String[] args) {//示例数据int arr[] = {3,2,7,4,1};System.out.println("====Before====");System.out.println(Arrays.toString(arr));//进行排序BubbleSort(arr);//展示结果System.out.println("====After====");System.out.println(Arrays.toString(arr));}//冒泡排序public static void  BubbleSort(int arr[]){int temp;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]){temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}}
}

代码(优化):

这里可优化在于,如果发现在某趟排序中,没有发生一次交换, 可以提前结束冒泡排序。

解决方式:可以通过一个标志位来进行判断 

//测试冒泡排序
public class BubbleSort {public static void main(String[] args) {int[] arr = {3,1,4,6,22,0,33,2,745,5,56,8};//  System.out.println("values数组原始顺序:"+Arrays.toString(arr));bubbleSort(arr);}public static void bubbleSort(int[] arr){//把冒泡排序的方法设置成static静态的,不允许改变代码;int temp;//定义一个布尔类型的变量,标记数组是否已到达有序状态;boolean flag = false;for(int i=0;i<arr.length;i++){//内循环,每一趟循环都从数列的前两个元素开始进行比较,比较到无序数组的最后;for (int j=0; j<arr.length-1-i;j++){//如果前一个元素大于后一个元素,则交换两元素的值;if (values[j] > values[j+1]){//进入这个if分支里边,则说明有元素进行了交换//所以将flag=trueflag = true;temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}//在进行完一轮的排序之后,判断本轮是否发生了元素之间的交换//如果没有发生交换,说明数组已经是有序的了,则直接结束排序
;if (flag){break;}else {//如果发生了交换,那么在下一轮排序之前将flag再次置为false//以便记录下一轮排序的时候是否会发生交换flag = false;}// System.out.println((i+1)+"趟排序:"+ Arrays.toString(arr));}}
}

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

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

相关文章

IP在网络通信中的重要作用

IP&#xff0c;全称Internet Protocol&#xff0c;即网际互连协议&#xff0c;是TCP/IP体系中的网络层协议。IP作为整个TCP/IP协议族的核心&#xff0c;是构成互联网的基础。它的作用重大且深远&#xff0c;下面将详细阐述IP的定义及其在网络通信中的重要作用。 首先&#xff0…

华为OD技术C卷“测试用例执行计划”Java解答

描述 示例 算法思路1 整体思路是&#xff0c;先读取特性的优先级和测试用例覆盖的特性列表&#xff0c;然后计算每个测试用例的优先级&#xff0c;并将其与测试用例的索引存储到二维数组中。最后按照优先级和索引排序&#xff0c;输出测试用例的索引&#xff0c;即为执行顺序。…

怎么避免电脑数据被拷贝?电脑如何禁用USB功能?

在无纸化办公的今天&#xff0c;很多重要数据都存放在电脑中。为了避免数据泄露&#xff0c;需要采用安全的方式保护电脑数据。那么&#xff0c;该如何避免电脑数据被拷贝呢&#xff1f;下面我们就来了解一下。 方法一&#xff1a;物理隔绝 物理隔绝是一种原始但有效的USB禁用…

C++初阶 | [九] list 及 其模拟实现

摘要&#xff1a;介绍 list 容器&#xff0c;list 模拟实现 list&#xff08;带头双向循环列表&#xff09; 导入&#xff1a;list 的成员函数基本上与 vector 类似&#xff0c;具体内容可以查看相关文档(cplusplus.com/reference/list/list/)&#xff0c;这里不多赘述。以下对…

leetcode 热题 100_两两交换链表中的节点

题解一&#xff1a; 迭代&#xff1a;设置节点指针存储结果&#xff0c;遍历链表&#xff0c;直接修改节点的指向。 class Solution {public ListNode swapPairs(ListNode head) {ListNode result new ListNode();result.next head;ListNode temp result;while (temp.next …

下载chromedrive,使用自动化

1、先看一下自己浏览器的版本 2、访问 https://googlechromelabs.github.io/chrome-for-testing/

基于单片机的家庭防盗报警系统

摘 要 随着社会的发展&#xff0c;人们生活水平的不断提高和家居用品的高档化&#xff0c;家庭安全隐患也随之增加&#xff0c;所以人们便进一步提高了对家庭的保护意识。因此&#xff0c;这就不得不促使安全防盗报警系统的普及与推广。 然而传统的防盗措施难以实现人们的需求…

网络基础 - 预备知识(协议、网络协议、网络传输流程、地址管理)

文章目录 1. 认识 协议2. 了解 网络协议2.1 引入 协议分层2.2 OSI 七层模型 与 TCP/IP 四层模型 3. 网络传输 流程&#xff01;&#xff01;&#xff01;3.1 网络传输流程图3.2 关于报头3.3 实例解释 传输过程&#xff08;封装与解包&#xff09; 4. 网络中的地址管理4.1 认识 …

EMQX 4.0和EMQX 5.0集群架构实现1亿MQTT连接哪些改进

EMQX 5.0水平扩展能力得到了指数级提升&#xff0c;能够更可靠地承载更大规模的物联网设备连接量。 在EMQX5.0正式发布前的性能测试中&#xff0c;我们通过一个23节点的EMQX集群&#xff0c;全球首个达成了1亿MQTT连接每秒100万消息吞吐&#xff0c;这也使得EMQX 5.0成为目前为…

如何利用百度SEO优化技巧将排到首页

拥有一个成功的网站对于企业和个人来说是至关重要的&#xff0c;在当今数字化的时代。在互联网上获得高流量和优质的访问者可能并不是一件容易的事情&#xff0c;然而。一个成功的SEO战略可以帮助你实现这一目标。需要一些特定的技巧和策略、但要在百度搜索引擎中获得较高排名。…

基于YOLOv8深度学习的脑肿瘤智能检测系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测、智慧医疗

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

rust学习(简单链表)

编写一个简单链表&#xff0c;主要遇到的问题就是next指针&#xff08;按照C的写法&#xff09;的数据如何定义。按照网上的建议&#xff0c;一般定义如下&#xff1a; struct Node {pub value:u32,pub next:Option<Rc<RefCell<Node>>>, //1 }1.用Option主要…