快速排序应该是一种应用最广泛的排序算法了。它是一种归并排序算法,即:将一个数组分成两个子数组,每个子数组独立进行排序。当两个子数组都有序时,整个数组自然也就有序了。将一个数组分成两个子数组的过程我们称之为切分(partition),切分的位置取决于数组的内容。找到小于切点的放到切点左边,大于的则放到右边。切分过程图如下:
代码实现:
1 public class Quick { 2 public static void sort(int[] a){ 3 sort(a,0,a.length-1); 4 } 5 private static void sort(int[] a,int lo,int hi){ 6 if(hi <lo) return; 7 int j = partition(a,lo,hi); 8 sort(a,lo,j-1); 9 sort(a,j+1,hi); 10 } 11 private static int partition(int[] a,int lo,int hi){ 12 int i = lo,j = hi + 1; 13 int v = a[lo]; 14 while(true){ 15 while(a[++i]>v) break; 16 while(a[--j]<v) break; 17 if(i>j) break; 18 exch(a, i, j); 19 } 20 exch(a, lo, j); 21 return j; 22 } 23 private static void exch(int[] a,int i,int j){ 24 int t =a[i]; 25 a[i] = a[j]; 26 a[j] = t; 27 } 28 }
算法改进:
1.在排序小数组时应该切换到插入排序。
2.采用三取样切分,即:使用子数组中一些数的中位数进行切分数组。这样得到的切分更好,代价是需要计算中位数。