快速排序背景:应该是最为主流,应用最为广泛的算法了,快速排序顾名思义它的排序速度非常之快,快速排序的特点是原地排序只需要一个非常小的辅助栈,快速排序的缺点就是,快速排序非常的脆弱,在实现的时候要非常的小心才能够避免低劣的性能,我们也在各种教训中大大改进了快速排序的算法,使它的应用变得更加广泛。
快速排序的性质:快速排序是一种分治的排序算法,他将一个数组分成两个子数组,将两部分独立的排序。快速排序和归并排序是互补的,归并排序是将数组分成两个子数组分别排序,再将两个有序的子数组归并以将整个数组排序;而快速排序将数组的排序方式则是当两个子数组都有序时整个数组也就自然有序了。在第一种情况,递归调用发生在处理整个数组之前;在第二种情况中,递归调用发生在处理整个数组之后。在归并排序中,一个数组被分成两半;在快速排序中,切分的位置取决于数组的内容。
快速排序的代码:
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);
}
}
想要彻底的理解快速排序,还是需要下一定功夫的,我们的快速排序里面涉及到了一个快速切分的函数,prttition()这个函数,这个函数起的作用就是让我们已经确定的某个j来说a[j]要确定从a[lo]到a[j-1]中所有元素都不大于a[j],a[j+1]到a[hi]中所有元素都不小于a[j]。这样做的目的是如果我们分成的前后两部分都是有序的,那么我们整个数组也就是有序的了。
最后的最后吧,对我的排序类别的博客做一个总结吧,我真的对归并排序,快速排序,还是有很多疑问的,但是目前来说不想深究了,不是敷衍了事,而是,目前算法对我来说是一种工具,我要很好的使用它,并且在日后的学习中加深对算法的印象,直至以后可以更加深入的理解算法,最后要做到改进算法。