java冒泡排序
2015-07-05 02:14
381 查看
记得有一次笔试要写一个冒泡排序,一下子就懵了,虽然上学时有开过算法与结构的课,但基本都在打盹,根本就没有了解过其排序原理。好吧,以前的潇洒,现在的苦逼,趁失眠时间了解一下冒泡排序。
网上概念一大堆,参差不齐,最后写出来了,并可以升序排序。但对比了网上写的排序发现自己写的每一趟都比较到最后一个元素,可能是对概念没理解透彻吧(自我安慰一下)。后来发现这个博客描述写的挺好的:http://www.cnblogs.com/kkun/archive/2011/11/23/2260280.html,但感觉他的代码逻辑有点不正确,而且评论也有这样的反馈所以就不贴了,有兴趣的朋友可以前去了解。
博客上的简要描述
原理:比较相邻的元素。如果第一个比第二个大,就交换他们两个,按照从小到大或者从大到小的顺序进行交换,这样一趟过去后,最大或最小的数字被交换到了最后一位,
然后再从头开始进行两两比较交换,直到倒数第二位时结束。
例子为从小到大排序,
原始待排序数组| 6 | 2 | 4 | 1 | 5 | 9 |
第一趟排序(外循环)
第一次两两比较6 > 2交换(内循环)
交换前状态| 6 | 2 | 4 | 1 | 5 | 9 |
交换后状态| 2 | 6 | 4 | 1 | 5 | 9 |
第二次两两比较,6 > 4交换
交换前状态| 2 | 6 | 4 | 1 | 5 | 9 |
交换后状态| 2 | 4 | 6 | 1 | 5 | 9 |
第三次两两比较,6 > 1交换
交换前状态| 2 | 4 | 6 | 1 | 5 | 9 |
交换后状态| 2 | 4 | 1 | 6 | 5 | 9 |
第四次两两比较,6 > 5交换
交换前状态| 2 | 4 | 1 | 6 | 5 | 9 |
交换后状态| 2 | 4 | 1 | 5 | 6 | 9 |
第五次两两比较,6 < 9不交换
交换前状态| 2 | 4 | 1 | 5 | 6 | 9 |
交换后状态| 2 | 4 | 1 | 5 | 6 | 9 |
第二趟排序(外循环)
第一次两两比较2 < 4不交换
交换前状态| 2 | 4 | 1 | 5 | 6 | 9 |
交换后状态| 2 | 4 | 1 | 5 | 6 | 9 |
第二次两两比较,4 > 1交换
交换前状态| 2 | 4 | 1 | 5 | 6 | 9 |
交换后状态| 2 | 1 | 4 | 5 | 6 | 9 |
第三次两两比较,4 < 5不交换
交换前状态| 2 | 1 | 4 | 5 | 6 | 9 |
交换后状态| 2 | 1 | 4 | 5 | 6 | 9 |
第四次两两比较,5 < 6不交换
交换前状态| 2 | 1 | 4 | 5 | 6 | 9 |
交换后状态| 2 | 1 | 4 | 5 | 6 | 9 |
...
冒泡大概就这样的流程
一开始跟着概念写的(自我反省,大家勿喷):
View Code
网上的:
网上概念一大堆,参差不齐,最后写出来了,并可以升序排序。但对比了网上写的排序发现自己写的每一趟都比较到最后一个元素,可能是对概念没理解透彻吧(自我安慰一下)。后来发现这个博客描述写的挺好的:http://www.cnblogs.com/kkun/archive/2011/11/23/2260280.html,但感觉他的代码逻辑有点不正确,而且评论也有这样的反馈所以就不贴了,有兴趣的朋友可以前去了解。
博客上的简要描述
原理:比较相邻的元素。如果第一个比第二个大,就交换他们两个,按照从小到大或者从大到小的顺序进行交换,这样一趟过去后,最大或最小的数字被交换到了最后一位,
然后再从头开始进行两两比较交换,直到倒数第二位时结束。
例子为从小到大排序,
原始待排序数组| 6 | 2 | 4 | 1 | 5 | 9 |
第一趟排序(外循环)
第一次两两比较6 > 2交换(内循环)
交换前状态| 6 | 2 | 4 | 1 | 5 | 9 |
交换后状态| 2 | 6 | 4 | 1 | 5 | 9 |
第二次两两比较,6 > 4交换
交换前状态| 2 | 6 | 4 | 1 | 5 | 9 |
交换后状态| 2 | 4 | 6 | 1 | 5 | 9 |
第三次两两比较,6 > 1交换
交换前状态| 2 | 4 | 6 | 1 | 5 | 9 |
交换后状态| 2 | 4 | 1 | 6 | 5 | 9 |
第四次两两比较,6 > 5交换
交换前状态| 2 | 4 | 1 | 6 | 5 | 9 |
交换后状态| 2 | 4 | 1 | 5 | 6 | 9 |
第五次两两比较,6 < 9不交换
交换前状态| 2 | 4 | 1 | 5 | 6 | 9 |
交换后状态| 2 | 4 | 1 | 5 | 6 | 9 |
第二趟排序(外循环)
第一次两两比较2 < 4不交换
交换前状态| 2 | 4 | 1 | 5 | 6 | 9 |
交换后状态| 2 | 4 | 1 | 5 | 6 | 9 |
第二次两两比较,4 > 1交换
交换前状态| 2 | 4 | 1 | 5 | 6 | 9 |
交换后状态| 2 | 1 | 4 | 5 | 6 | 9 |
第三次两两比较,4 < 5不交换
交换前状态| 2 | 1 | 4 | 5 | 6 | 9 |
交换后状态| 2 | 1 | 4 | 5 | 6 | 9 |
第四次两两比较,5 < 6不交换
交换前状态| 2 | 1 | 4 | 5 | 6 | 9 |
交换后状态| 2 | 1 | 4 | 5 | 6 | 9 |
...
冒泡大概就这样的流程
一开始跟着概念写的(自我反省,大家勿喷):
private static String bubbleSort(int[] array) { int length = array.length; for (int i = 0; i < length; i++) { for (int j = 0; j < length; j++) { if (j+1 >= length) { break; } int first = array[j]; int second = array[j+1]; if (first > second) { array[j] = second; array[j+1] = first; } } } return Arrays.toString(array); }
View Code
网上的:
public class BubbleSort { public static void main(String[] args) { int[] array = new int[]{90, 12, 15, 15, 12, 90, 9, 21, 51, 3, 2, 1, 7, 8, 9}; System.out.println("array:"+Arrays.toString(array)); System.out.println("bubbleSort:"+bubbleSort(array)); } private static String bubbleSort(int[] array) { int length = array.length; for (int i = 0; i < length; i++) { for (int j = 0; j < length-1-i; j++) { int first = array[j]; int second = array[j+1]; if (first > second) { array[j] = second; array[j+1] = first; } } } return Arrays.toString(array); } }
相关文章推荐
- Java多线程—Executor框架
- 用Eclipse插件Bytecode Outline来查看Java字节码
- java基础—面向对象——变量的区别
- socket vs RMI
- 使用Eclipse来搭建hadoop开发环境问题总结
- Java RMI 服务器框架
- Java RMI协议开发
- Java课程设计
- Java RMI 入门指南
- Java RMI之HelloWorld篇
- yarn-resource.java阅读笔记
- Ubuntu下利用MyEclipse开发Hadoop
- JAVA开发环境及其开发
- spring security 3中关于ajax的处理
- myeclipse中svn插件安装使用
- Spring技术内幕:Spring AOP的实现原理(四)
- 理解---Java回调机制
- Java 中的成员内部类
- SPring MVC 表单校验
- Java回调的一种简易实现