算法思想:
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
实现分析:
1.每次将基准数排到他正确的位置(p),并保证其大于它左边的数小于它右边的数。2.并递归排序它左右两边的部分,递归出口:左界价表>=右界下标。
1段的实现:有这列数中选出一个基准数,如:第一个元素。然后,通过下标i从左往右遍历这些数,找到不小于基准的数和下标j从右向左遍历找出的不大于基准的数,两者交换位置。注意下标的界限保证。遍历出的i >= j的时候,j就是基准正确的位置。之前的循环也保证了比基准小的数在前,大的数在后面。
2段的实现:标准的递归调用,不作过多说明。
贴一段简单的实现:
public class QuickSort {
public static void sort(int[] a, int l, int r){
if(l > r) return;
int p = partition(a, l, r);
sort(a, l, p-1);
sort(a, p+1, r);
}
private static int partition(int[] a, int l, int r) {
int key = a[l];
int i = l ;
int j = r + 1 ;
for(;;){
while(a[++i] < key && i < r);
while(a[--j] > key );
if(j > i){
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}else{
a[l] = a[j];
a[j] = key;
return j;
}
}
}
}
注意红色部分的地方,若使用不当,或漏写程序很可能有下标越界错误!
在贴一个算法导论里的实现:
public int paratition(int[] a ,int l, int r){
int i = l - 1 ;
int x = a[r];
for(int j=l; j<=r-1; j++){
if(a[j] <= x){
i = i + 1;
swap(a, i, j);
}
}
i = i + 1;
swap(a, i, r);
return i;
}