排序算法之冒泡排序
2016-04-03 21:44
148 查看
排序算法之冒泡排序
点开JDK的Arrays工具类,有个静态方法sort(),一直用着,也没怎么看过源码,于是心血来潮,点开看看。原来是背后用的是DualPivotQuicksort。原文:
This class implements the Dual-Pivot Quicksort algorithm by Vladimir Yaroslavskiy, Jon Bentley, and Josh Bloch. The algorithm offers O(n log(n)) performance on many data sets that cause other quicksorts to degrade to quadratic performance, and is typically faster than traditional (one-pivot) Quicksort implementations.
对于the Dual-Pivot Quicksort algorithm,虽然看过流程图了,但感觉到确实不太懂。于是回顾回顾基本排序算法知识,深感学习排序算法,要理解,可以这样思考:
一趟排序后,发生什么
一共,需要几趟排序
冒泡排序
冒泡排序是简单排序的一种,思想是:只在相邻元素间比较或交换,一趟排序后,最大元素放到尾部
那么,此时需要外层循环多少次来执行一趟排序呢?从尾部往前遍历
所以:
步骤一:从头开始循环,比较相邻元素,小的放在前
步骤二:外层循环,从最后一个元素开始,往前遍历
步骤三:当不再发生交换时,结束循环。那么设个标记。
public static void bubbleSort(int[] array,int length) { int i,j,flag; for(i = length - 1; i >= 0; i--) { flag = 0; for(j=0;j<length-1;j++) { //相邻元素比较 if(array[j + 1] < array[j]) { //swap(array[j],(array[j+1]) array[j] = array[j] + array[j+1]; array[j+1] = array[j] - array[j+1]; array[j] = array[j] - array[j+1]; flag = 1;//标记交换 } if(flag == 0 ) { break; } } } } public static void main(String[] args) { int[] a = { 12, 6, 8, 33, 16, 22, 9, 14, 2, 17 }; bubbleSort(a,a.length); for(int i : a) { System.out.print(i + " "); } }
上面结果是没问题,不过仔细想想,既然一趟排序后,尾部的元素已经有序,那么它们就不必参与内层循环了,外层循环是从尾部开始的,所以,可以这样修改,提高效率
public static void bubbleSort(int[] array,int length) { int i,j,flag; for(i = length - 1; i >= 0; i--) { flag = 0; for(j = 0; j < i; j++) { //相邻元素比较 if(array[j + 1] < array[j]) { //swap(array[j],(array[j+1]) array[j] = array[j] + array[j+1]; array[j+1] = array[j] - array[j+1]; array[j] = array[j] - array[j+1]; flag = 1;//标记交换 } if(flag == 0 ) { break; } } } }
此外,还可以这样思考,个人认为上面的容易理解。
步骤三:外层要循环多少次?2个元素,1趟,3个元素,2趟。。。
//此种方式,思考外层循环循环多少次,即比较多少趟 for (int j = 0; j < length - 1; j++) { // 一趟排序,相邻两个元素比较,最大元素放到最后,同时,长度上去掉已经排好的位置 for (int i = 0; i < length - 1 - j; i++) { if (array[i + 1] < array[i]) { // 交换,小的在前 array[i] = array[i] + array[i + 1]; array[i + 1] = array[i] - array[i + 1]; array[i] = array[i] - array[i + 1]; } } } }
相关文章推荐
- Linux之压缩与解压缩
- 20159320《网络攻防实践》第5周学习总结
- Spring(三)AOP面向切面编程
- DELL DOSA 6.X 服务器引导光盘Dell Systems Build and Update Utility ISO下载地址
- html基础开发-- Jquery框架方法使用(攻略二)
- (第7讲)java基本数据类型转换
- 观察者模式在android 上的最佳实践
- Spring(二)scope、集合注入、自动装配、生命周期
- android使用kotlin开发基础(一)之 hello kotlin
- 函数的缺省参数
- 理解数学空间,从距离到希尔伯特空间
- Android设计模式应用-组合模式
- 【day0403】C++ 数组形参的传递
- C语言-二分查找(折半查找)算法
- LeetCode 92. Reverse Linked List II
- php的mysql\mysqli\PDO(三)PDO
- 利用全局变量$_SESSION和register_shutdown_function自定义会话处理
- 2016年4月1日作业
- 无法新建scala文件
- Android开发找工作之前先看看这些知识点吧