九大排序算法之快速排序
- 算法思想:选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。
- 实例
- 代码实现
//快速排序
//先找到一个位置j,使左边的子数组都比其小,右边的子数组都比其大
//将一个数组分成两个子数组,将两部分独立的排序
//时间复杂度:NlogN,空间复杂度:lgN
public class Quick {
public static void sort(Comparable[] a) {
sort(a,0,a.length-1);
}
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);
}
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;
}
private static boolean less(Comparable v,Comparable w) {
return v.compareTo(w)<0;
}
private static void exch(Comparable[] a,int i,int j) {
Comparable t=a[i];
a[i]=a[j];
a[j]=t;
}
public static boolean isSorted(Comparable[] a) {
for(int i=1;i<a.length;i++) {
if(less(a[i],a[i-1])) return false;
}
return true;
}
private static void show(Comparable[] a) {
for(int i=0;i<a.length;i++) {
System.out.print(a[i]+" ");
}
System.out.println();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
String[] a= {"3","2","4","5","7"};
sort(a);
assert isSorted(a);
show(a);
}
}