JAVA排序之冒泡排序
冒泡排序是以从小到大排序为例,每一轮排序就找出未排序序列中最大值放在最后。像金鱼吐泡泡,越到后面越大,所以叫冒泡排序。
基本的冒泡排序算法:
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排序之冒泡排序相关推荐
- java排序链表冒泡排序_Java中的冒泡排序
java排序链表冒泡排序 Java Sorting is one of the many aspects of java interview questions. In this post, we w ...
- Java排序算法——冒泡排序 及其稳定性和时间复杂度
冒泡排序(Bubble Sort) 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序错误就把他们交换过来.走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成 ...
- Java排序:冒泡排序
排序思路 1.相邻元素做比较,根据大小做位置交换,做完一次全比较后,最后的元素应该为最大(最小)的元素. 2.重复以上操作直达所有元素有序排列. 根据以上思路代码如下 for(int i=0;i< ...
- Java排序算法——插入排序(Insertion Sort)
之前总结了交换排序的冒泡排序与选择排序的简单选择排序,这次我们来看看插入排序的简单插入排序~ 往期传送门: 冒泡排序: Java排序算法--冒泡排序(Bubble Sort)https://blog. ...
- Java排序算法:冒泡排序
Java排序算法:冒泡排序 //创建数组并赋值int[] data = new int[] {11,10,55,78,100,111,45,56,79,90,345,1000};for(int i=0 ...
- Java十大排序算法总结,Java排序算法总结之冒泡排序
本文实例讲述了Java排序算法总结之冒泡排序.分享给大家供大家参考.具体分析如下: 前言:冒泡排序(BubbleSort)就是依次比较相邻的两个数,将小数放在前面,大数放在后面. 下面让我们一起 ...
- java数组排序冒泡排序_java数组常见的排序——选择排序和冒泡排序
将数组中的元素按照一定的顺序(从小到大,或从大到小)排列 1,以下用了常用的两种排序,选择排序和冒泡排序 package com.mydemo02; import java.util.Arrays; ...
- Java基础语法——选择排序、冒泡排序以及二分查找法和Arrays类的使用
本文将带你了解选择排序.冒泡排序以及二分查找法的原理和代码实现,以及通过Arrays类快速实现对数组的一些操作 文章目录 一.选择排序 二.冒泡排序 三.二分查找法 四.Arrays类(对数组的操作) ...
- 常用七种排序之冒泡排序(排序图解+分析Java
hello呀!各位,这里是Sunlightʊə. 目前大三,主要在学习Java语言.可以一起交流呀! 相关文章: 常用七种排序之选择排序(排序图解+分析Java 常用七种排序之希尔排序(排序图解+分析 ...
最新文章
- c 服务器通信和文件传输,服务器、终端和文件传输方法
- Python初学的几个迷惑点
- centos7网卡识别不到,无法远程工具连接
- 有这几个编程利器网站,再也不愁学习
- Linux进程里运行新代码,linux调度器源码分析 - 新进程加入(三)
- SpringCloud工作笔记062---APP消息推送_个推平台API使用经验
- 几种常用设计模式的简单示例
- matlab自带的信号,实验一 连续时间信号在MATLAB中的表示..ppt
- 开发平台(Platform Builder 和 Embedded Visual C++)简介
- android以ini文件形式保存在内部存储_Android中将Bitmap对象以PNG格式保存在内部存储中...
- pcl 使用gpu计算法向量_PCL点云特征描述与提取(1)
- java计算机毕业设计九宫格日志网站源码+数据库+系统+lw文档+mybatis+运行部署
- 怎么把几个音频合并在一起?
- 蓝牙双模音频模块 BT401蓝牙BLE应用笔记
- Linux perf 1.1、perf_event内核框架
- input-group两侧添加额外元素
- Kubernetes核心原理(二)之Controller Manager
- 计算机基础(笔记)——计算机网络(链路层)
- TP-Link基于亚马逊云科技部署面向运营商的IoT云管平台
- 今日头条最新signature
热门文章
- z77用m2固态_个人分享华硕Z77主板刷BIOS支持的NVME的经验
- MapboxMap之Expression(一)
- 主流开源监控系统汇总
- 猎豹收割移动广告市场,挑战几何?
- 最新商业运营版H5游戏陪玩陪聊系统源码破解版附带详细视频+文字搭建教程
- 三十四载 Windows 崛起之路: 苹果、可视都是微软“铺路石”
- Redis底层多路复用
- python 将字符串时间转换为date对象
- 语言学与计算机交叉学科,科学网—计算机与信息科学交叉研究领域:X-informatics (转载2篇) - 章成志的博文...
- 为什么煲鸡汤给病人喝?