当前位置:网站首页>2.1冒泡排序(Bubble Sorting)
2.1冒泡排序(Bubble Sorting)
2022-07-29 11:41:00 【TUJC】
2.1、冒泡排序
2.5.1、基本介绍
通过对待排序序列从前向后,依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。

小结上面的图解过程:
(1)一共进行数组的大小-1次大的循环;
(2)每一趟排序的次数在逐渐的减少;
(3)如果我们发现在某趟排序中,没有发生一次交换,可以提前结束冒泡排序。这个就是优化
优化:
因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志flag判断元素是否进行过交换。从而减少不必要的比较。(这里说的优化,可以在冒泡排序写好后,在进行)
2.1.2 代码实例
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
public class BubbleSort {
public static void main(String[] args) {
// int arr[] = {3, 9, -1, 10, 20};
//
// System.out.println("排序前");
// System.out.println(Arrays.toString(arr));
//为了容量理解,我们把冒泡排序的演变过程,给大家展示
//测试一下冒泡排序的速度O(n^2), 给80000个数据,测试
//创建要给80000个的随机的数组
int[] arr = new int[80000];
for(int i =0; i < 80000;i++) {
arr[i] = (int)(Math.random() * 8000000); //生成一个[0, 8000000) 数
}
Date data1 = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date1Str = simpleDateFormat.format(data1);
System.out.println("排序前的时间是=" + date1Str);
//测试冒泡排序
bubbleSort(arr);
Date data2 = new Date();
String date2Str = simpleDateFormat.format(data2);
System.out.println("排序后的时间是=" + date2Str);
//System.out.println("排序后");
//System.out.println(Arrays.toString(arr));
/* // 第二趟排序,就是将第二大的数排在倒数第二位 for (int j = 0; j < arr.length - 1 - 1 ; j++) { // 如果前面的数比后面的数大,则交换 if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } System.out.println("第二趟排序后的数组"); System.out.println(Arrays.toString(arr)); // 第三趟排序,就是将第三大的数排在倒数第三位 for (int j = 0; j < arr.length - 1 - 2; j++) { // 如果前面的数比后面的数大,则交换 if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } System.out.println("第三趟排序后的数组"); System.out.println(Arrays.toString(arr)); // 第四趟排序,就是将第4大的数排在倒数第4位 for (int j = 0; j < arr.length - 1 - 3; j++) { // 如果前面的数比后面的数大,则交换 if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } System.out.println("第四趟排序后的数组"); System.out.println(Arrays.toString(arr)); */
}
// 将前面额冒泡排序算法,封装成一个方法
public static void bubbleSort(int[] arr) {
// 冒泡排序 的时间复杂度 O(n^2), 自己写出
int temp = 0; // 临时变量
boolean flag = false; // 标识变量,表示是否进行过交换
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]) {
flag = true;
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
//System.out.println("第" + (i + 1) + "趟排序后的数组");
//System.out.println(Arrays.toString(arr));
if (!flag) {
// 在一趟排序中,一次交换都没有发生过
break;
} else {
flag = false; // 重置flag!!!, 进行下次判断
}
}
}
}
边栏推荐
猜你喜欢

自采集在线电脑壁纸php源码v2.0自适应端

Pyqt5 rapid development and practice 6.6 qformlayout & 6.7 nested layout & 6.8 qsplitter

QT's user-defined interface (borderless and movable)

LED透明屏和LED玻璃显示屏区别

Why should kubernetes be used in development environments

Paddlelite compilation and code running through the disk

2022 latest WiFi master applet independent version 3.0.8

【Unity3D】场景切换、退出全屏、退出游戏

宝塔快速搭建自适应咖啡网站模板与管理系统源码实测

puzzle(017.5)联动归位
随机推荐
Similarities and differences of QWidget, qdialog and qmainwindow
学习周刊-总第64期-一个v2ex风格的开源论坛程序
How to start writing helm charts for your kubernetes application
One click blog building: how to use WordPress plug-in to build a dedicated blog
如何使用 grep 跨多行查找模式匹配
QML(一):自定义圆角按钮的处理
企业微信客户朋友圈一天可以发多少条?都有哪些限制?如何突破朋友圈可展示人数限制?
sql join中on条件后接and和where
AI model risk assessment Part 2: core content
【无标题】
解决 Chrome 浏览器被毒霸篡改问题
【Unity3D】角色控制器(CharacterController)
多元宇宙:重塑新商业格局
MyCat中间件高可用、读写分离、分片、主从切换、ER分片
Meituan and hungry were interviewed by Hangzhou supervisors to implement the responsibility of food safety management and prohibit malicious competition
【图像检测】基于灰度图像的积累加权边缘检测方法研究附matlab代码
MarkDown高阶语法手册
Alibaba architects spent a year sorting out the "Lucene advanced document", and you are also a big factory employee!
自采集在线电脑壁纸php源码v2.0自适应端
Why should kubernetes be used in development environments