冒泡排序的基本思想:

通过对待排序序列从前到后(从下标小的元素开始),依次比较相邻位置的元素的值,若发现与给定的次序冲突,则交换位置(假设数值大的数放在序列的后面),使数值较大的元素逐渐从前移动到后部,就像冒泡一样。

对于冒泡排序,我们可以对它进行一定的优化:

在排序的过程中,每个元素都不断的接近自己的位置,当在一次排序中,我们发现,使用冒泡排序之后,该序列的任何两个个元素都没有进行交换,这个时候说明该序列已经有序,我们就不需要继续进行排序算法了,此时我们推出该排序算法。如果要执行这个优化,我们需要在排序的过程中加入一个标志变量flag用来判断是否这个序列中的元素在一次排序算法的过程中进行了交换。如果一趟排序下来f'lag = true,那么就说明,该序列进行了交换,我们就继续执行排序算法,如果flag=false,就说明该序列没有交换,那么我们直接break即可。

冒泡排序的例子:

从以上的例子中,我们可以得出结论:

(1).在整个排序的过程中,我们一共进行了arr.length-1趟排序。

(2).每一趟排序的数字的个数都在减少,每次减1,这个我们就可以理解成,随着躺数的增加(i的增加),我们待排序的数目每次都会减i。

(3).如果在我们的排序中,有一次没有进行交换,那么我们可以提前结束这个排序(优化)。

接下来我会用代码详细介绍冒泡排序的算法,该代码主要分三部:

(1).根据每趟的结果讲解每趟的执行过程。

(2)将(1)部的代码整合,形成冒泡排序的算法。

(3)冒泡排序的优化

具体的说明我会在代码的注释中详细表述。

(1).根据每趟的结果讲解每趟的执行过程。

public static void main(String[] args) {
int[] arr = {3,9,-1,10,-2};
// int[] arr = {1,2,3,6,5};
System.out.println("冒泡排序之前的序列:");
System.out.println(Arrays.toString(arr)); //数组的方法,将数组转换成字符串 System.out.println("排序后的序列:"); //分步骤的排序算法
System.out.println("第一躺排序:");
int temp = 0;//中间变量
//j<arr.length-1的原因是因为,我们需要将第一个数跟第二个数比较,如果不减一,我们会一直循环到最后一个数,因为最后一个数没有下一个数,会导致数组越界
for(int j=0;j<arr.length-1;j++){//这个地方实际上是j<arr.length-1-0,0代表了执行的第一趟序列 if(arr[j]>arr[j+1]){
//交换两个数,通过中间变量来交换
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
System.out.println(Arrays.toString(arr)); System.out.println("第二躺排序:");
for(int j=0;j<arr.length-1-1;j++){ //1代表了执行的第二趟序列
if(arr[j]>arr[j+1]){
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
System.out.println(Arrays.toString(arr));
System.out.println("第三躺排序:");
for(int j=0;j<arr.length-1-2;j++){//2代表了执行的第三趟序列
if(arr[j]>arr[j+1]){
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
System.out.println(Arrays.toString(arr));
System.out.println("第四躺排序:");
for(int j=0;j<arr.length-1-3;j++){//3代表了执行的第四趟序列
if(arr[j]>arr[j+1]){
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
System.out.println(Arrays.toString(arr));
}

上图我们得到的结果如下:

由此可见跟我们之前的例子上的答案相同,只不过是分步执行。

(2)将(1)部的代码整合,形成冒泡排序的算法。

public static void main(String[] args) {
int[] arr = {3,9,-1,10,-2};
// int[] arr = {1,2,3,6,5};
System.out.println("冒泡排序之前的序列:");
System.out.println(Arrays.toString(arr)); //数组的方法,将数组转换成字符串 System.out.println("排序后的序列:");
//
//冒泡排序算法
int temp = 0;
//根据(1)中的代码,我们知道了,我们一共执行了arr.length-1趟的排序,并且,在我们的小循环中,每次执行排序的元素的个数是arr.length-1-i
//这样我们就可以把两者结合,得到如下的冒泡排序的算法
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;
}
}
System.out.println(Arrays.toString(arr));
} }

我们得到的结果如下:

由此可见,与上述的方法得到的结果一致。

(3)冒泡排序的优化

	public static void main(String[] args) {
// int[] arr = {3,9,-1,10,-2};
int[] arr = {1,2,3,6,5}; //序列变成这个
System.out.println("冒泡排序之前的序列:");
System.out.println(Arrays.toString(arr)); //数组的方法,将数组转换成字符串 System.out.println("排序后的序列:");
// ////冒泡排序优化算法
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; //如果进行到这步了,那么一定说明进行交换了,将flag置为true.
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
if(flag){
System.out.println(Arrays.toString(arr)); //如果交换了,直接打印出来
flag = false;//这个地方很重要!!!!因为我们要继续判断下一次是否进行了交换,因此我们需要将flag重置为false.
}else{
break;//说明已经有序,直接退出。
}
}
}

 上述代码得到的结果如下:

只执行了一趟,发现有序,退出循环,从而做到了对冒泡排序的优化。

在接下来的几天,我会将排序的8大算法都做成文档进行讲解。

同是小白,互相帮助~

Java数据结构之排序---冒泡排序的更多相关文章

  1. Java数据结构与排序

    一.引子:想要给ArrayList排序却发现没有排序方法?你有两种选择:        1.换用TreeSet:     2.使用Collection.sort(List<T> list) ...

  2. [Java]数组排序-选择排序 冒泡排序 插入排序

    1 选择排序  原理:a 将数组中的每个元素,与第一个元素比较          如果这个元素小于第一个元素, 就将这个         两个元素交换.       b 每轮使用a的规则, 可以选择出 ...

  3. JAVA数据结构--希尔排序

    希尔排序通过将比较的全部元素分为几个区域来提升插入排序的性能.这样可以让一个元素可以一次性地朝最终位置前进一大步.然后算法再取越来越小的步长进行排序,算法的最后一步就是普通的插入排序,但是到了这步,需 ...

  4. 2017.12.9 Java中的排序---冒泡排序、快速排序、选择排序

    //冒泡排序 public class demo{ public static void main(String[] args) { int[] sum={2,9,10,1,5,88}; System ...

  5. Java ——数组 选择排序 冒泡排序

    本节重点思维导图 数组 public static void main(String[] args) { int a ; a=3; int[] b; b = new int[3];//强制开辟内存空间 ...

  6. Java数据结构之排序

    1.冒泡排序:时间复杂度为O(n2) 假设是由小到大排序:相邻两个数之间进行比较,较大的数在后面.一次比较过后最大的数排在最后面 如:40.8.15.18.12一次排序后为:8.15.18.12.40 ...

  7. JAVA数据结构--选择排序

    选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然 ...

  8. Java数据结构(排序篇)

    冒泡排序:是经过n-1趟子排序完毕的,第i趟子排序从第1个数至第n-i个数,若第i个数比后一个数大(则升序,小则降序)则交换两数.大泡在上,小泡在下. 选择排序:每一趟从待排序的数据元素中选出最小(或 ...

  9. Java数据结构之排序---快速排序

    快速排序是对冒泡排序的一种改进. 快速排序的基本思想: 假设我们以升序为例,它的执行流程可以概括为,每一趟选择当前所有子序列中的一个关键字(通常我们选择第一个,下述代码实现选择的也是第一个数)作为枢纽 ...

随机推荐

  1. Luogu p2456 二进制方程

    这是一道我也不知道我gu了多久的题目 (然鹅还有n多任务没有完成) 反正--我太难了 好了言归正传,题目链接 是一道校内测的题目(现在应该没有人没考了吧?) 思路的话,是神仙并查集√ 觉得虽然并查集很 ...

  2. uboot环境变量

    一. uboot运行时环境变量分布 1.1. 环境变量有2份,一份在Flash中,另一份在DDR中.uboot开机时一次性从Flash中读取全部环境变量到DDR中作为环境变量的初始化值,然后使用过程中 ...

  3. H264 RTP包解析

    1.  预备 视频: 由一副副连续的图像构成,由于数据量比较大,因此为了节省带宽以及存储,就需要进行必要的压缩与解压缩,也就是编解码. h264裸码流: 对一个图像或者一个视频序列进行压缩,即产生码流 ...

  4. 封装 多态 类的约束 super

    python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情况具体分 ...

  5. 初次尝试python爬虫,爬取小说网站的小说。

    本次是小阿鹏,第一次通过python爬虫去爬一个小说网站的小说. 下面直接上菜. 1.首先我需要导入相应的包,这里我采用了第三方模块的架包,requests.requests是python实现的简单易 ...

  6. Python 入门之常用运算符

    Python 入门之常用运算符 Python中的运算按种类可分为算数运算.比较运算.逻辑运算.赋值运算.成员运算.身份运算.位运算 1.常用运算符: (1)算数运算符: + - * / %(取余(模) ...

  7. 搜索专题: HDU1372Knight Moves

    Knight Moves Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tot ...

  8. Neo4j清空所有数据

    两种方法: 一.用下列 Cypher 语句: match (n) detach delete n 二. 1.停掉服务: 2.删除 graph.db 目录: 3.重启服务. 原文地址:http://ne ...

  9. PCIeのType0与Type1型配置请求与BAR(基地址寄存器)

    PCIe中存在两种配置空间Type0&type1,TYPE0对应非桥设备(Endpoint),Type1对应桥设备(Root和Switch端口中的P2P桥)因为Root每个端口总都含有一个P2 ...

  10. [译]送给 ES6 开发者的7个 hack

    关注原来的 JavaScript hacks,上面有一些新的好东西.2018 使用 JavaScript 写代码真的又变得有意思了! Hack #1 — 交换变量 使用数组结构来交换值 let a = ...