排序原理:
1.首先设定一个分界值,把数组分成两部分
2.将大于等于分界值的数据放到到数组右边,小于分界值的数据放到数组的左边。
3.将两数组重复1.2.步骤
4.递归后,所有数据都排好了顺序,再将数据拼接起来。
切分原理:
1.找一个基准值,用两个指针分别指向数组的头部和尾部的后一位;
2.从尾部向头部开始搜索一个比基准值小的数,搜索到即停止,并记录指针的位置;
3.从头部向尾部开始搜索一个比基准值大的数,搜索到即停止,并记录指针的位置;
4.交换当前左边指针位置和右边指针位置的数;
5.重复2,3,4步骤,直到两指针重合。
6.交换第一个数和指针位置的数
切分代码:
完整代码:
public class Quick
{
private static boolean less(Comparable x,Comparable y)
{
return x.compareTo(y)<0;
}
private static void exch(Comparable[]a,int i,int j)
{
Comparable t=a[i];
a[i]=a[j];
a[j]=t;
}
public static void sort(Comparable[] a)
{
int lo=0;
int hi=a.length-1;
sort(a,lo,hi);
}
private static void sort(Comparable[]a,int lo,int hi){
if(hi<=lo)
{
return;
}
int par=partition(a,lo,hi); //排好顺序后的分界值的位置。
sort(a,lo,par-1);
sort(a,par+1,hi);
}
public static int partition(Comparable[] a, int lo, int hi){
int right=hi+1;
int left=lo;
Comparable key=a[lo];
while(true) {
while (less(key, a[--right])) {
if (right == lo)
break;
}
while (less(a[++left], key)) {
if (left == hi) {
break;
}
}
if(left>=right){
break;
}else
exch(a,left,right);
}
exch(a,lo,right);
return right;
}
public static void main(String[] args) {
Integer[] a={15,21,7,8,5,66,3,2,1 };
Quick.sort(a);
System.out.println(Arrays.toString(a));
}
}