快速排序背景:應該是最爲主流,應用最爲廣泛的算法了,快速排序顧名思義它的排序速度非常之快,快速排序的特點是原地排序只需要一個非常小的輔助棧,快速排序的缺點就是,快速排序非常的脆弱,在實現的時候要非常的小心才能夠避免低劣的性能,我們也在各種教訓中大大改進了快速排序的算法,使它的應用變得更加廣泛。
快速排序的性質:快速排序是一種分治的排序算法,他將一個數組分成兩個子數組,將兩部分獨立的排序。快速排序和歸併排序是互補的,歸併排序是將數組分成兩個子數組分別排序,再將兩個有序的子數組歸併以將整個數組排序;而快速排序將數組的排序方式則是當兩個子數組都有序時整個數組也就自然有序了。在第一種情況,遞歸調用發生在處理整個數組之前;在第二種情況中,遞歸調用發生在處理整個數組之後。在歸併排序中,一個數組被分成兩半;在快速排序中,切分的位置取決於數組的內容。
快速排序的代碼:
package Quick;
public class Quick {
public static void sort(Comparable[] a) {
sort(a, 0, a.length - 1);
}
private 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;
}
public 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 void show(Comparable[] a) {
for (int i = 0; i < a.length; i++) {
System.out.println(a[i] + " ");
System.out.println();
}
}
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;
}
public static void main(String[] args) {
String[] a = "B,D,C,A,E,G,F, ".split(",");
sort(a);
assert isSorted(a);
show(a);
}
}