/**
- 算法理解:
- 1 i向右扫描比base = sortSTr[left]还小的数,直到遇到比base大的数停下来
- 2 j向左扫描比base大的数,直到遇到比base小的数停下来
- 3 可见i扫描过得的数一定比base小,j扫描过得数一定比base大
- 4 1,2都成立时交换i,j位置,是为了保证3的成立
- 5 当i,j相等时,将sortSTr[i]和base交换,使得base与sortSTr[i]交换后,
- base左边的数一定都比base小,base右边的数一定比base大,此时完成了快排的第一轮
- 6 第二轮以后就是复制以上,分别将左半边和右半边递归即可
*/
private void quickSort1(int[] sortSTr,int left,int right ) throws Exception {
int i,j;
i = left;
j = right;
int base = sortSTr[left];
while(i < j) {//每一轮循环结束后基准数归位,左边的都比基准数小,右边的都比基准数大
//如果右边的数比基准数大的,j-继续探索,如果比基准数小,跳出此循环
//注意 && i < j 这个条件很重要,比如i=4和j=5时,不能再让i,j同时减了,只能让i+或者j-,这样才能出现i=j
while(base <= sortSTr[j] && i < j) {
j--;
}
//如果左边的数比基准数小的,i+继续探索,如果比基准数大,跳出此循环
while(base >= sortSTr[i] && i < j) {
i++;
}
// 上面两个循环都跳出了,说明找到右边的数比基准数小的sortSTr[j],左边找到了比基准数大的sortSTr[i]
// 确保每一轮循环结束后基准数归位,左边的都比基准数小,右边的都比基准数大
if(i < j) {
int temp = sortSTr[i];
sortSTr[i] = sortSTr[j];
sortSTr[j] = temp;
}
}
if(i == j) {
// 跳出while(i < j)循环说明,i和j相等了,基准数下表找到了,即为i,j,将基准数和sortSTr[i]交换位置(即将基准数归位)
int temp1 = sortSTr[i];
sortSTr[i] = sortSTr[left];
sortSTr[left] = temp1;
// 递归左半边数组和右半边数组
if(i - 1 > left) {
quickSort1(sortSTr,left,i - 1);
}
if(right > j + 1) {
quickSort1(sortSTr,j + 1,right);
}
}
}