java中的快速排序
0x00 前言
学习java中,懂一些基本语法。于是就想学习下基本排序算法,作为一个脚本小子,对算法确实蛋疼。
最开始写了个(照葫芦画瓢)冒泡排序,然后就是快速排序,由此进入主题。
以后还会不断放出学习笔记!
0x01 快速排序历史
什么历史和各类快速排序的版本,我就不说了,网上有说得很全面的了。
后面会给出一些优秀的参考资料,菜B没有资格讲这些!
0x02 经典快排
自己网上搜索,看了不少参考(很多都是半懂)!
快速排序的基本思想就是:选择一个基准(参考)元素,比它小的在左边,比它大的在右边,然后就有3个分组。
左边数组1,中间数组2(一个基准元素),右边数组3。
然后左边和右边数组再进行前面的过程(迭代而已)。
最后全部按顺序连接起来,就排好序了!
粘贴过来的经典代码(在eclipse是试了下)
1 public void qsort1(int[] a, int p, int r) { 2 // 0个或1个元素,返回 3 if (p >= r) 4 return; 5 // 选择左端点为pivot 6 int x = a[p]; 7 int j = p; 8 for (int i = p + 1; i <= r; i++) { 9 // 小于pivot的放到左边 10 if (a[i] < x) { 11 swap(a, ++j, i); 12 } 13 } 14 // 交换左端点和pivot位置 15 swap(a, p, j); 16 // 递归子序列 17 qsort1(a, p, j - 1); 18 qsort1(a, j + 1, r); 19 }
1 public static void swap(int[] a, int i, int j) { 2 int temp = a[i]; 3 a[i] = a[j]; 4 a[j] = temp; 5 }
当然上述代码没有做任何优化,关于原始快速排序算法的优化详见参考1,很不错的文章!
0x03 优化
作为编程的菜B,当然不可能自己优化。这里就是记录下,以后好用呵呵!
说到优化,java的标准库中已经有了排序比较好的优化了,这里就借此来说一说。
java.util.Arrays.sort 其实就是调整优化过后的快速排序算法(严格说不准确)
快速排序的优化点:
优化1:在小规模(size<7)数组中,直接插入排序的效率要比快速排序高。
快速排序的最差情况是n^2,在数组元素小于7时直接插入排序反而要比快排,归并排序要好。数组规模小,简单算法的比较次数不会比先进算法多多少。相反,诸如快排,归 并排序等先进算法使用递归操作,所付出的运行代价更高。
优化2:精心选择划分元素,即基准元素。
基准元素的差异,导致可能面临最差的情况,当然可以随机化来选择,只是这样就会在随机化的过程中消耗时间。
如果是小规模数组(size<=7),直接取中间元素作为枢轴
如果是中等规模数组(7=<size<=40),则在数组首、中、尾三个位置上的数中取中间大小的数作为枢轴
如果是大规模数组(size>40),则在9个指定的数中取一个伪中数(中间大小的数s)
优化3:根据基准元素p划分,形成一个形如 (<p)* p* (>p)* 的数组
具体看参考2。对于重复较多的数组做了优化。
java.util.Arrays.sor有多个版本可以选择,支持数组对象(菜B还在学习这个)!
这个的源代码就不贴了!很多可以借鉴下!
0x04 参考
参考1: http://www.blogjava.net/killme2008/archive/2010/09/08/quicksort_optimized.html 参考2: http://hxraid.iteye.com/blog/665095/
0x05 结束
都是粘接粘贴代码而已,希望不只是应用,也能从中学习下好的思想,说不定以后改改就是适应实际场景的好的快速排序了!呵呵!
不要问我编程和算法,本身不是搞这个的!