快速排序是一种基于分治思想的排序算法 它主要分为以下几步
1、一个数组按切分元素分成两个数组,一个数组是大于切分元素的,另一个数组是小于切分元素的,
2、然后将这两个部分按上面的思路独立排序。
3、并将有序的子数组归并 得到一个完整的数组。
这中间的关键就在于切分。
代码实现
public class Quick {
private static void sort(Comparable[] a, int l0, int l1) {
// TODO Auto-generated method stub
if(l0 > l1) return; //做基本的判断
int l2=partition(a,l0,l1); //调用方法实现按切分 得到最终a所在位置
sort(a,l0,l2-1); //排序比a小的数组
sort(a,l2+1,l1); //排序比a大的数组
}
private static int partition(Comparable[] a, int l0, int l1) { //定义切分方法
int i=l0; int j=l1+1; //定义左右指针
Comparable v=a[0]; //获得切分元素
while(true){ 扫描左右
while(less(a[++i],v)) if(i==l1) break;
//调用 less方法做判断a[i] 和v 直到a[i]大于v时 或者 i 到数组末尾时才停止
while(less(v,a[j--])) if(j==l0) break;
//调用 less方法做判断a[j] 和v 直到a[j]小于v时 或者 i 到数组头时才停止
if(i>j) break; //做判断 如果作为切分调出循环
exch(a,i,j); 调用exch()方法来吧a[i]和a[j] 交换位置
}
exch(a,l0,j); //调用exch()方法 将v放入正确的位置
return j;
}
}
复杂度 NlgN 空间复杂度 lgN 其运行效率与切分元素值有关 一把在排序之前先随机整个数组。 快速排序也是最快的通用排序算法。
分治,字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题。所以他有三个要点
1、划分步:把输入的问题划分为k个子问题,并尽量使这k个子问题的规模大致相同
2、治理步:调用处理方法来处理问题。
3、组合步:组合步把各个子问题的解组合起来。
在快速排序中将一个数组按切分元素分成两个数组就是在不同的划分步。然后将这两个部分按上面的思路独立排序 这就是治理步。 最后将所有的子数组归并到一个数组 就是组合步。
加入技术讨论群
为了方便大家相互交流学习,社区群人数已经2500+,欢迎大家加下面助手微信,拉大家进群,自由交流。
喜欢QQ群的,可以扫描下面二维码:
欢迎大家通过二维码打赏支持技术社区(英雄请留名,社区感谢您,打赏次数超过40+):