代码
public static void quickSort(int[] arr,int left,int right){
int l = left;
int r = right;
//pivot 中轴值
int pivot = arr[(left + right) / 2];
int temp = 0;
//while循环的目的是让比pivot值小的放左边,比pivot值大的放右边
while(l < r){
//在pivot左边一直找,找到大于等于pivot值,才退出
while(arr[l] < pivot){
l += 1;
}
//在pivot右边一直找,找到大于等于pivot值,才退出
while(arr[r] > pivot){
r -= 1;
}
//如果l >= r,说明左边都是<=pivot的值,右边都是>=pivot的值
if(l >= r){
break;
}
//交换
temp = arr[l];
arr[l] = arr[r];
arr[r] = temp;
//如果交换完后,发现这个arr[l] == pivot,那么r前移
if(arr[l] == pivot){
r -= 1;
}
//如果交换完后,发现这个arr[r] == pivot,那么l后移
if(arr[r] == pivot){
l += 1;
}
}
//不判断,出现栈溢出
if(l == r){
l += 1;
r -= 1;
}
//向左递归
if(left < r){
quickSort(arr, left, r);
}
//向右递归
if(right > l){
quickSort(arr, l, right);
}
}
效率
//8000 0000 17781ms
//800 0000 1632ms
//80 0000 154ms
//8 0000 27ms