第2章:快速排序
1 写在最前面
-
时间复杂度 O (NlogN)
-
顺序很重要,要先从右边开始找
** 认真看**
(1) 从右往左,a[j]的值比基准值大的,则j一直左移,直到遇到比基准值小的停下,然后a[i]从左往右遇到比基准值大的停下,交换数值,倒数第二次交换完。
(2) 每次从右往左开始找,j停在了比基准值小的数的位置上,与i相遇,将这个值与基准值交换,符合条件
(3) 要是从左往右开始找,当i停在了比基准值大的位置上,与j相遇,将这个值与基准值交换的话,就不符合条件了,也可能会出现i=j,且a[i]与a[j]的值都比基准值大
2 代码实现
public static void quickSort(int[] array,int left,int right){
//递归推出条件
if(left>right){
return;
}
//初始化左右指针
int i = left;
int j = right;
//base中存的就是基准数
int base = array[left];
while(i!=j){ //while(i<j)
//顺序很重要,要先从右往左找
//小于base才停下来
while(array[j]>=base&&i<j){
j--;
}
//再从左往右找
//大于base才停下来
while(array[i]<=base&&i<j){
i++;
}
//交换两个数在数组中的位置
//当哨兵i和哨兵j没有相遇时
if(i<j){
array[i] = array[i]^array[j];
array[j] = array[i]^array[j];;
array[i] = array[i]^array[j];
}
}
//终将基准数归位
array[left] = array[i];
array[i] = base;
//继续处理左边的,这里是一个递归的过程
quickSort(array,left,i-1);
//继续处理右边的,这里是一个递归的过程
quickSort(array,j+1,right);
}