排序算法——快速排序
2016-03-24 20:06
225 查看
快速排序
快速排序是一种分治的排序算法。他将一个数组分成两个子数组,将两个部分独立地排序。
归并排序的递归调用在处理整个数组之前,快速排序的递归调用发生在处理整个数组之后。
切分的策略是随意地取a[lo]作为切分元素,从数组左端开始向右直到找到一个大于等于它的元素,再从数组右端直到找到一个小于等于它的元素。显然这个元素是没有排定的,因此交换他们的位置。如此继续,当两个指针相遇,我们只需要切分元素和指针位置交换,返回指针位置即可。
快速排序框架
快速排序的切分
快速排序的最差时间复杂度为O(N2),平均时间复杂度为O(N*logN)。
注意:1.对于小数组,快速排序比插入排序慢。
2.对于含有大量重复元素的数组,我们将数组切分为三部分,分别对应于小于等于和大于切分元素的数组元素。
快速排序是一种分治的排序算法。他将一个数组分成两个子数组,将两个部分独立地排序。
归并排序的递归调用在处理整个数组之前,快速排序的递归调用发生在处理整个数组之后。
切分的策略是随意地取a[lo]作为切分元素,从数组左端开始向右直到找到一个大于等于它的元素,再从数组右端直到找到一个小于等于它的元素。显然这个元素是没有排定的,因此交换他们的位置。如此继续,当两个指针相遇,我们只需要切分元素和指针位置交换,返回指针位置即可。
快速排序框架
public class Quick { public static void sort(Comparable[] a,int lo, int hi) { if(hi <= lo) return; int j = partition(a,lo,hi);//切分 sort(a,lo,j-1);//将左半部分进行排序 sort(a,j+1,hi);//将右半部分进行排序
} public static void sort(Comparable[] a) { stdRandom.shuffle(a);//消除对输入的依赖 sort(a,0,length-1); } }
快速排序的切分
private static int partition(Comparable[] a, int lo, int hi) { int i =lo,j = hi+1; Comparable v = a[lo]; while(true) { while(less(a[++i],v)) if(i==hi) break; while(less(v,a[--j])) if(j==lo) break; if(i>=j) break; exch(a,i,j); } exch(a,lo,j); return j; }
快速排序的最差时间复杂度为O(N2),平均时间复杂度为O(N*logN)。
注意:1.对于小数组,快速排序比插入排序慢。
2.对于含有大量重复元素的数组,我们将数组切分为三部分,分别对应于小于等于和大于切分元素的数组元素。
相关文章推荐
- HDU 5122 水题
- 安卓开发中@SuppressLint( NewApi )问题的解决方法
- JS使用document.write输出时换行符的使用
- Spring Batch 之 Spring Batch 简介(一)
- 2637: 编程题:类---矩形类
- android Listview中设置enable状态,显示点击的item
- OC学习-block
- 实验二:网络测试命令和工具的使用
- 两个队列实现一个栈
- 线段树(区间操作) POJ 3325 Help with Intervals
- linux下的open函数中的mode问题
- CALayer使用(1)
- iOS缓存清理
- 关于“模仿”和“创新”
- kindeditor使用
- MyEclipse------如何连接MySQL
- 【bzoj3160】万径人踪灭 FFT+manacher
- 《编写高质量代码:改善Objective-C程序的61个建议》
- Struts2中的相对路径与绝对路径
- FragmentPagerAdapter与FragmentStatePagerAdapter