首页 > 编程语言 >14 -- 排序算法之冒泡排序

14 -- 排序算法之冒泡排序

时间:2022-09-26 11:13:31浏览次数:56  
标签:tmp 10 arr 14 -- 冒泡排序 int 排序 逆序

冒泡排序的基本思想:通过对 待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的数逐渐从前移向后,就像水底下的气泡一样逐渐向上冒。

优化思想:因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来发现并没有发生元素数据所在位置的交换,就说明数据已经有序了,因此要在排序过程中设置一个flag判断元素是否进行交换,从而减少不必要的比较

应用实例:将5个无序的数3,9,-1,10,-2使用冒泡排序将其排成从小到大的数列

原始数组:3,9,-1,10,-2 【相邻元素逆序则交换顺序】

第一趟比较:

3,9,-1,10,-2 【3 < 9,顺序位置不变】

3,-1,9,10,-2 【9 > -1,逆序交换位置】

3,-1,9,10,-2 【9 < 10,顺序位置不变】

3,-1,9,-2,10 【10 > -2,逆序交换位置】

下边的步骤以此类推 -->

第二趟比较(继第一趟比较的结果):

-1,3,-2,9,10 【3 > -1,逆序交换位置】

-1,-2,3,9,10 【3 > -2,逆序交换位置】

-1,-2,3,9,10 【3 < 9,顺序位置不变】

第三趟比较(继第二趟比较结果):

-2,-1,3,9,10 【-1 > -2,逆序交换位置】

-2,-1,3,9,10 【-1 < -3,顺序位置不变】

第四趟比较(继第三趟比较结果):

-2,-1,3,9,10

冒泡排序规律小结:

  1. 设元素个数为i,则共进行了(i-1)趟的比较,原因:确定了(i-1)个元素的位置,则最后一个元素的位置就也确定了
  2. 由于每一趟的比较都会确定最大数据的位置,所以下一趟中需要排序的数的个数会逐渐减少,得出规律为:第 j 趟比较中待排序的数据需要比较的次数为:i - j
  3. 如果我们发现在某次排序中并没有发生元素数据的交换,说明当前数据的已经排好序了,直接结束冒泡排序

代码一:冒泡排序演变过程

 1 import java.util.Arrays;
 2 
 3 //冒泡排序
 4 public class BubbleSort {
 5 
 6     public static void main(String[] args) {
 7         int[] arr = {3,9,-1,10,-2 };
 8         
 9         //第一趟排序,将最大的数放置在数组的最后
10         int tmp = 0; //临时变量用于交换
11         for(int i = 0; i < arr.length - 1; i++) { //第一趟排序需要比较的次数
12             if (arr[i] > arr[i+1]) {
13                 //逆序交换两个数
14                 tmp = arr[i];
15                 arr[i] = arr[i+1];
16                 arr[i+1] = tmp;
17             }
18         }
19         System.out.println("第一趟排序后:" + Arrays.toString(arr));
20         
21         // 第二趟排序,将第二大的数放置在数组的倒数第二个位置
22         for (int i = 0; i < arr.length - 2; i++) { // 第二趟排序需要比较的次数
23             if (arr[i] > arr[i + 1]) {
24                 // 逆序交换两个数
25                 tmp = arr[i];
26                 arr[i] = arr[i + 1];
27                 arr[i + 1] = tmp;
28             }
29         }
30         System.out.println("第二趟排序后:" + Arrays.toString(arr));
31                 
32         // 第三趟排序,将第三大的数放置在数组的倒数第三个位置
33         for (int i = 0; i < arr.length - 3; i++) { // 第三趟排序需要比较的次数
34             if (arr[i] > arr[i + 1]) {
35                 // 逆序交换两个数
36                 tmp = arr[i];
37                 arr[i] = arr[i + 1];
38                 arr[i + 1] = tmp;
39             }
40         }
41         System.out.println("第三趟排序后:" + Arrays.toString(arr));
42         
43         // 第四趟排序,将最大的数放置在数组的倒数第四个位置
44         for (int i = 0; i < arr.length - 4; i++) { // 第四趟排序需要比较的次数
45             if (arr[i] > arr[i + 1]) {
46                 // 逆序交换两个数
47                 tmp = arr[i];
48                 arr[i] = arr[i + 1];
49                 arr[i + 1] = tmp;
50             }
51         }
52         System.out.println("第四趟排序后:" + Arrays.toString(arr));
53     }
54 
55 }

 

 总结出规律后可得以下代码:

 1 import java.util.Arrays;
 2 
 3 //冒泡排序
 4 public class BubbleSort {
 5 
 6     public static void main(String[] args) {
 7         int[] arr = {3,9,-1,10,-2 };
 8         boolean flag = false;
 9         int tmp = 0;
10         for(int i = 0; i < arr.length - 1; i++) { //比较的趟数
11             for(int j = 0; j <arr.length - 1 - i; j++) { //每一趟比较的次数为:总的数据个数 - 趟数
12                 if (arr[j] > arr[j+1]) {
13                     flag = true;
14                     tmp = arr[j];
15                     arr[j] = arr[j+1];
16                     arr[j+1] = tmp;
17                 }
18             }
19             if (!flag) {
20                 //说明本次比较没有发生数据的交换
21                 break;
22             }else {
23                 //说明本轮比较发生了数据的交换,需要重置flag
24                 //原因:假如共有5趟比较,在第二趟时已经发现数据并未交换【即已经时有序的了】,flag将无法变为false,也就无法提前跳出循环
25                 //会继续将这5次循环运行完才结束,失去了优化的意义
26                 System.out.println("第" + (i+1) + "趟比较:" + Arrays.toString(arr));
27                 flag = false;
28             }
29         }
30         System.out.println(Arrays.toString(arr));
31     }
32 
33 }

 

 更换数据数据:

 

结果:

 

标签:tmp,10,arr,14,--,冒泡排序,int,排序,逆序
From: https://www.cnblogs.com/yumengqifei/p/16586722.html

相关文章

  • PADS应用笔记:Logic画元件封装时端点不见了
    现象画原理图的元件封装时,画好的CAE逻辑明明定义里很多端点但是导入到元件时就都不见了,只剩下个2D线方框原因出现这种原因是因为在元件的电气特性里没有定义对应引......
  • 关于DP的一些模板与题目
    1.线性DP  斐波那契数列(%1000)实现#include<iostream>#include<algorithm>#include<cmath>usingnamespacestd;longlongf[1000005],a[1000005];longlongD......
  • js 变量提升
    a();functiona(){alert('1')}vara=function(){alert('2')}a();//先弹出alert(1),再弹出alert(2)a();vara=function(){alert('2')}functi......
  • Mysql---数据类型
    数据类型概述  charactersetname:创建数据库时createdatabasedbtest characterset'utf8';创建数据库未指明......
  • 《Vision Permutator: A Permutable MLP-Like ArchItecture For Visual Recognition》
    论文题目:《VisionPermutator:APermutableMLP-LikeArchItectureForVisualRecognition》 论文作者:QibinHou,ZihangJiang,LiYuan etal.论文发表年份:2022.2......
  • 电商平台淘宝API获取商品详情,按关键词搜索,拍立淘,商品评论销量商品类目,买家卖家订单接
    接口所示,部分接口item_get-获得淘宝商品详情item_search-按关键字搜索淘宝商品item_search_img-按图搜索淘宝商品(拍立淘)item_review-获得淘宝商品评论item_ge......
  • 看这里,全网最详细的Sonar代码扫描平台搭建教程
    每天进步一点点,关注我们哦,每天分享测试技术文章本文章出自【码同学软件测试】码同学公众号:自动化软件测试,领取资料可加:magetest码同学抖音号:小码哥聊软件测试01Sonar安......
  • leetcode-简单1-8
    目录1.两数之和2.回文数3.罗马数字转整数4.最长公共前缀5.有效的括号6.最大同时在线人数7.无重复字符的最长子串8.链表删除倒数第n个节点1.两数之和/*题目:两数之和详细......
  • css 外边距塌陷问题
    两个块级元素嵌套,如果里面的元素没有设置border属性,在内层的元素使用margin时会把父元素节点也会跟着移动,故外边距塌陷问题,解决方法,可以给父元素添加border,或者给......
  • SpringBoot集成Mybatis-Plus
    简介MyBatis-Plus(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。因此,mybatis-plus包含mybatis的所有功能,因此无需再次......