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     }
View Code
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     }
swap的代码

当然上述代码没有做任何优化,关于原始快速排序算法的优化详见参考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 结束

都是粘接粘贴代码而已,希望不只是应用,也能从中学习下好的思想,说不定以后改改就是适应实际场景的好的快速排序了!呵呵!

不要问我编程和算法,本身不是搞这个的!

posted @ 2014-10-07 20:34  K1ra8  阅读(168)  评论(0编辑  收藏  举报