public void quickSort(int[] a, int start, int end) {//start和end是要排序的区间
int i = start;
int j = end;//先把start和end保存下来,因为后面的递归会用到
if (start >= end) {//如果两个游标相遇,或者start>end,退出
return;
}
boolean flag = true;//定义一个标记,很重要
int temp;//定义临时变量,交换用
while (i != j) {//true是从左往右比,false是从右往左比
if (a[i] > a[j]) {//交换
temp = a[i];
a[i] = a[j];
a[j] = temp;
flag = !flag;//标志取反
}
if (flag) {如果是从左往右比
j--;
} else {如果是从右往左比
i++;
}
}
i--;
j++;//i,j都退一格
quickSort(a, start, i);//递归分号边的数组
quickSort(a, j, end);//递归分号边的数组
}
快排的思想是:找一个数,以它为分界,把比它小的数放在它左边,比它大的数放在它右边,然后递归这个过程,直到数组变得 有序。
一般把第一个数作为和别的数比较的数,
第一次7和5比较,7是a[i],5是a[j],7大于5,交换;
第二次7和9比较,9是a[i],7是a[j],9大于7,交换;
第三次7和8比较,7是a[i],8是a[j],7小于8,不变;
。
。
。
最后i = j,while循环结束;
最后数组被7分开,大于7的数在7右边,小于7的数在7的左边,然后递归左右两个数组,直到整个数组有序