本节的主题是快速排序,它可能是运用最为广泛的排序了,因为它很快.相比于其它算法而言,它适用于各种不同的输入数据且在一般应用中比其它算法快得多,快速排序引人注目的是它只需要一个小小的辅助栈,且将长度为N的数组排序所需要的时间和NlogN成正比,我们已经学习过的算法都无法同时结合这两个优点.
该算法的关键部分在于切分,这个过程满足以下三个条件:
-
对于某个j,A[j]已经排定
-
A[lo]到到A[j-1]所有元素都不大于A[j]
-
A[j+1]到A[hi]所有元素都不小于A[j]
我们就是通过不断的地切分来进行快速排序的.
代码部分
public class Quick {
public static void main(String[] args) {
int A[] = { 12, 234, 4, 3, 123, 5, 32, 64, 13, 1, 3, 13, 12, 89};
sort(A, 0, A.length - 1);
show(A);
}
public static void show(int[] A) {
for(int i = 0; i < A.length; i++)
System.out.print(A[i]+" ");
}
public static void sort(int[] 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 int partition(int[] A, int lo, int hi) {
//将分组切割为A[lo..i-1],A[i],A[i+1..hi]
int i = lo, j = hi + 1;
int v = A[lo];
while (true) {
//扫描左右,检查扫描是否结束并且交换元素
while (A[++i] > v)
if (i == hi)
break;
while (A[--j] < v)
if (j == lo)
break;
if (i >= j)
break;
exch(A, i, j);
}
exch(A, lo, j);
return j;
}
public static void exch(int[] A, int i, int j) {
int temp = A[i];
A[j] = A[i];
A[i] = temp;
}
}