【排序算法】快速排序(java实现)
2016-04-27 20:15
411 查看
1.基本思想:
它采用了一种分治的策略,通常称为分治法。分治法思想:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。
对于数组A, 随机选择一个元素作为基准数pos,一般为第一个元素或最后一个元素。
将该数组分为两堆A[0,pos_index-1] 和 A[pos_index+1,n],一堆元素全都小于pos ,另一堆元素全都大于pos ,pos_index 为基准素的下标。
按照分治思想,左右两堆分别进行快排递归操作,即QuickSort(A, 0, pos_index -1) 和 QuickSort(A, pos_index +1 , n) 。
1)一趟排序过程:
2)整个排序过程:
2.算法分析:
平均时间复杂度: O(nlog2n) 最坏(有序情况下):O(n^2)空间复杂度: O(logn) 最坏 O(n)
稳定性: 不稳定
3.算法实现:
<span style="white-space:pre"> </span>public static int partition(int[] array,int l, int r){ int pos = array[l]; while(l<r){ //从右往左找出比基准数小的下标r while(l < r && array[r] >= pos) r--; // 与基准数交换 int tmp = array[r]; array[r] = array[l]; array[l] = tmp; //从左往右找出比基准数大的下标l while(l < r && array[l] <= pos) l++; tmp = array[r]; array[r] = array[l]; array[l] = tmp; } return l; } public static void QuickSort(int[] array,int l, int r){ if(l<r){ //确定基准数在一次遍历后的下标,左右两边递归进行 int t = partition(array,l,r); QuickSort(array,l,t-1); QuickSort(array,t+1,r); } }
4.算法优化:
1.只对长度大于k的子序列递归调用快速排序,让原序列基本有序,然后再对整个基本有序序列用插入排序算法排序。详见 http://blog.csdn.net/naruto_ahu/article/details/8192039
2. 通过随机选择初始基准数,使得当面对有序序列时,时间复杂度也为O(nlog2n);同时,去掉了没有必要的对基准数值的来回交换,只需要最后的时候放到目标位置上就可以了。
<span style="white-space:pre"> </span>public static int partition1(int[] array,int l, int r){ int index = (int) (Math.random() % (r - l+1) + l); int pos = array[ (int) (Math.random() % (r - l+1) + l)]; while(l<r){ //从右往左找出比基准数小的下标r while(l < r && array[r] >= pos) r--; // 与基准数交换 array[index] = array[r]; index = r; //从左往右找出比基准数大的下标l while(l < r && array[l] <= pos) l++; array[index] = array[l]; index = l; } array[l] = pos; // 将基准数放入最后所求分割位置 return l; } public static void QuickSort(int[] array,int l, int r){ if(l<r){ //确定基准数在一次遍历后的下标,左右两边递归进行 int t = partition1(array,l,r); QuickSort(array,l,t-1); QuickSort(array,t+1,r); } }
相关文章推荐
- JAVA原型模式
- Java资源文件读取
- Java基础 | 程序入口main()方法
- Java IO流的使用
- Java IText使用PDF模板 生成 输出PDF
- 【java】 iText使用PDF模板生成输出PDF
- 极客开源-如何使用Java来发送一封电子邮件?
- Google Java Style 中文版
- spring web 访问页面出现多余前缀和后缀情况
- Java迭代器 | Iterator用法
- MyEclipse10+pydev环境搭建
- JAVA技术发展——你不知道的J2SE(一)
- 说说javap命令
- (转)RSA加密解密及数字签名Java实现
- [转]JAVA String 类
- java_web servlet第二课
- Java JDBC | 四种连接数据库的方法
- Java RMI 框架(远程方法调用)
- java spring代码通用结构-java
- 20145120 《Java程序设计》实验四实验报告