快排的思想:
给定左下标,右下标,和中间节点,通过交换,使左边都小于中间,右边都大于中间,然后让左边递归,划分出左右下标,中间节点,右边同样如此,达到整体的排序效果
代码思路:
记录左,右下标,中间节点,当左小于右时,就一直进行判断,如果左边小于中间,那就让下标加1直到大于中间,如果右边大于中间,就让下标一直减1直到小于中间,此时已经跳出了判断,目前的左右下标都是不符合条件的数,让这两个数交换。
当左等于中间时,让右-1,当右等于中间时,让左+1,这是为了后续递归
最后直到左下标>=右下标,一轮交换结束,此时在中间左边都小于中间,右边都大于中间
现在进行判断,如果左下标等于右下标,让左+1,让右-1,否则会栈溢出
最后进行左右的递归调用
public static void quick(int[] arr,int left,int right) {
int l = left;
int r = right;
int pivot = arr[(left + right) / 2];
int temp = 0;
while (l < r){
while (arr[l] < pivot) {
l++;
}
while (arr[r] > pivot) {
r--;
}
if (l >= r){
break;
}
temp = arr[l];
arr[l] = arr[r];
arr[r] = temp;
if (arr[l] == pivot){
r--;
}
if (arr[r] == pivot){
l++;
}
}
if (l == r){
l++;
r--;
}
if (left < r){
quick(arr,left,r);
}
if (right > l){
quick(arr,l,right);
}
}