冒泡排序是以从小到大排序为例,每一轮排序就找出未排序序列中最大值放在最后。像金鱼吐泡泡,越到后面越大,所以叫冒泡排序。

基本的冒泡排序算法:

public class BobbleSort {public static void bubblySort_1(int []num){for (int i=0;i<num.length;i++){//表示遍历次数减1for (int j=1;j<num.length-i;j++){//依次与后面的相比较if (num[j-1]>num[j]){//如果前面的比后面的大,交换变量int temp;//设置中间交换变量temp=num[j-1];num[j-1]=num[j];num[j]=temp;}}}}public static void main(String[] args) {int num []={12,78,2,9,7,5};bubblySort_1(num);for(int i:num){System.out.print(i+" ");}}
}

结果:

2 5 7 9 12 78 

但是这个的时间复杂度为O(n∧2),如果对于一个本身有序的序列,或则序列后面一大部分都是有序的序列,上面的算法就会浪费很多的时间开销,所以可以将这个算法进行优化,设置一个flag标志,如果这一趟发生了交换,则为true,否则为false,如果有一趟没有发生交换,说明已经是有序队列。

优化的冒泡排序算法:

    public static void bubbleSort_2(int [] num){int n=num.length;boolean flag = true;//发生了交换就为truewhile (flag){flag=false;//每次开始排序前,重置for(int j=1; j<n; j++){if(num[j-1] > num[j]){int temp;temp = num[j-1];num[j-1] = num[j];num[j]=temp;//表示交换过数据;flag = true;}}n--;//减少一次排序}}public static void main(String[] args) {int num []={12,78,2,9,7,5};//bubblySort_1(num);bubbleSort_2(num);for(int i:num){System.out.print(i+" ");}}

结果:

2 5 7 9 12 78 

如果有100个数的数组,仅前面10个无序,后面90个都已排好序且都大于前面10个数字,那么在第一趟遍历后,最后发生交换的位置必定小于10,且这个位置之后的数据必定已经有序了,记录下这位置,第二次只要从数组头部遍历到这个位置就可以了。

再次优化的冒泡排序算法:

 public static void bubbleSort_3(int [] num){int k;int flag = num.length ;//flag来记录最后交换的位置,也就是排序的尾边界while (flag > 0){//排序未结束标志k = flag; //k 来记录遍历的尾边界flag = 0;for(int j=1; j<k; j++){if(num[j-1] > num[j]){int temp;temp = num[j-1];num[j-1] = num[j];num[j]=temp;flag = j;//记录最新的尾边界.}}}}public static void main(String[] args) {int num []={12,2,2,9,7,9,10,14,25,36,54};//bubblySort_1(num);//bubbleSort_2(num);bubbleSort_3(num);for(int i:num){System.out.print(i+" ");}}

结果:

2 2 7 9 9 10 12 14 25 36 54 

双向冒泡排序,此算法与冒泡排序的不同处在于排序时是以双向在序列中进行排序

双向冒泡排序算法:

public class BobbleSort {public static void bubbleSort_4(int[] num) {int len = num.length;int left = 0, right = len -1;while (left<right){//最坏的情况下也至少为1个数int flagLeft = left + 1;int flagRight = right - 1;//从左往右找出最大的数for (int j = left;j<right;j++){if (num[j]>num[j+1]){int temp = num[j];num[j] = num[j+1];num[j+1] = temp;//记录下最后交换的位置,flagRight后面的数表示已经完成排序(也有可能是最后的一个数)// 右排序完成一次,后面的左排序只需要排这个flagRight之前的//flagRight之后的数已经完成好了排序flagRight = j;}}right = flagRight;for (int j = right;j>left;j--) {if (num[j] < num[j - 1]) {int temp = num[j-1];num[j - 1] = num[j];num[j] = temp;//记录下最后交换的位置,flagLight前面的数表示已经完成排序(也有可能是第一个数)// 左排序完成一次,下一次的排序只需要从flagLight之后开始排序//flagLight之后的数已经完成好了排序flagLeft = j;}}left = flagLeft;}}public static void main(String[] args) {int [] num = new int[10];//随机数for (int i = 0;i< 10;i++){num[i] = (int)(Math.random()*100);}bubbleSort_4(num);for(int i:num){System.out.print(i+" ");}}
}

结果:

7 20 26 26 37 57 63 73 77 98 

差不多我所理解的就是这些了,欢迎留言讨论,转载请注明出处,谢谢!

JAVA排序之冒泡排序相关推荐

  1. java排序链表冒泡排序_Java中的冒泡排序

    java排序链表冒泡排序 Java Sorting is one of the many aspects of java interview questions. In this post, we w ...

  2. Java排序算法——冒泡排序 及其稳定性和时间复杂度

    冒泡排序(Bubble Sort) 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序错误就把他们交换过来.走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成 ...

  3. Java排序:冒泡排序

    排序思路 1.相邻元素做比较,根据大小做位置交换,做完一次全比较后,最后的元素应该为最大(最小)的元素. 2.重复以上操作直达所有元素有序排列. 根据以上思路代码如下 for(int i=0;i< ...

  4. Java排序算法——插入排序(Insertion Sort)

    之前总结了交换排序的冒泡排序与选择排序的简单选择排序,这次我们来看看插入排序的简单插入排序~ 往期传送门: 冒泡排序: Java排序算法--冒泡排序(Bubble Sort)https://blog. ...

  5. Java排序算法:冒泡排序

    Java排序算法:冒泡排序 //创建数组并赋值int[] data = new int[] {11,10,55,78,100,111,45,56,79,90,345,1000};for(int i=0 ...

  6. Java十大排序算法总结,Java排序算法总结之冒泡排序

    本文实例讲述了Java排序算法总结之冒泡排序.分享给大家供大家参考.具体分析如下: 前言:冒泡排序(BubbleSort)就是依次比较相邻的两个数,将小数放在前面,大数放在后面. 下面让我们一起    ...

  7. java数组排序冒泡排序_java数组常见的排序——选择排序和冒泡排序

    将数组中的元素按照一定的顺序(从小到大,或从大到小)排列 1,以下用了常用的两种排序,选择排序和冒泡排序 package com.mydemo02; import java.util.Arrays; ...

  8. Java基础语法——选择排序、冒泡排序以及二分查找法和Arrays类的使用

    本文将带你了解选择排序.冒泡排序以及二分查找法的原理和代码实现,以及通过Arrays类快速实现对数组的一些操作 文章目录 一.选择排序 二.冒泡排序 三.二分查找法 四.Arrays类(对数组的操作) ...

  9. 常用七种排序之冒泡排序(排序图解+分析Java

    hello呀!各位,这里是Sunlightʊə. 目前大三,主要在学习Java语言.可以一起交流呀! 相关文章: 常用七种排序之选择排序(排序图解+分析Java 常用七种排序之希尔排序(排序图解+分析 ...

最新文章

  1. c 服务器通信和文件传输,服务器、终端和文件传输方法
  2. Python初学的几个迷惑点
  3. centos7网卡识别不到,无法远程工具连接
  4. 有这几个编程利器网站,再也不愁学习
  5. Linux进程里运行新代码,linux调度器源码分析 - 新进程加入(三)
  6. SpringCloud工作笔记062---APP消息推送_个推平台API使用经验
  7. 几种常用设计模式的简单示例
  8. matlab自带的信号,实验一 连续时间信号在MATLAB中的表示..ppt
  9. 开发平台(Platform Builder 和 Embedded Visual C++)简介
  10. android以ini文件形式保存在内部存储_Android中将Bitmap对象以PNG格式保存在内部存储中...
  11. pcl 使用gpu计算法向量_PCL点云特征描述与提取(1)
  12. java计算机毕业设计九宫格日志网站源码+数据库+系统+lw文档+mybatis+运行部署
  13. 怎么把几个音频合并在一起?
  14. 蓝牙双模音频模块 BT401蓝牙BLE应用笔记
  15. Linux perf 1.1、perf_event内核框架
  16. input-group两侧添加额外元素
  17. Kubernetes核心原理(二)之Controller Manager
  18. 计算机基础(笔记)——计算机网络(链路层)
  19. TP-Link基于亚马逊云科技部署面向运营商的IoT云管平台
  20. 今日头条最新signature

热门文章

  1. z77用m2固态_个人分享华硕Z77主板刷BIOS支持的NVME的经验
  2. MapboxMap之Expression(一)
  3. 主流开源监控系统汇总
  4. 猎豹收割移动广告市场,挑战几何?
  5. 最新商业运营版H5游戏陪玩陪聊系统源码破解版附带详细视频+文字搭建教程
  6. 三十四载 Windows 崛起之路: 苹果、可视都是微软“铺路石”
  7. Redis底层多路复用
  8. python 将字符串时间转换为date对象
  9. 语言学与计算机交叉学科,科学网—计算机与信息科学交叉研究领域:X-informatics (转载2篇) - 章成志的博文...
  10. 为什么煲鸡汤给病人喝?