单向扫描
基准数为最右边
private static void quickSortLineryArray(int[] a, int start, int end) {
if(a.length == 0 || a.length == 1) {
return ;
}
int i = start;
int j = start; //j负责检查小于key的
int key = a[end];
while(j < end){
if(a[j] < key) {
//每查到一个和i交换位置,i之前的位置都小于key
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
i++;
}
j++;
}
int tmp = a[i];
a[i] = a[end];
a[end] = tmp;
if(i > start)quickSortLineryArray(a, start, i-1);
if(i < end)quickSortLineryArray(a, i+1, end);
}
双向扫描
基准数为最左边(就要右边指针先动),基准数在最右边(就要左边的指针先动)。否则会出现错误
左边找比基准数(图中为6)大的,右边找比基准数小的(递增)
省去若干步骤……
i=j之后就和基准数交换位置(也就是3和6交换位置)
void quickSort(int a[], int left, int right) {
if (left > right) return;
int i = left, j = right;
int key = a[right], temp;
while (i != j) {
//基准数在右边,所以左边指针先动
while (a[i] <= key && i < j) ++i;
while (a[j] >= key && i < j) --j;
if (i < j) {
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
a[right] = a[i];
a[i] = key;
quickSort(a, left, i - 1);
quickSort(a, i + 1, right);
}