看写法二吧,写法一将方法抽离出来,却降低了效率。
写法一(经实测,数据量大时,容易会溢出。)
private void quickSort3(int[] arr, int left, int right) {
if(left<right){
int middle = getMiddle(arr,left,right);//实际的排序流程
//利用分治法的思想对数组进行递归。
quickSort3(arr, left, middle-1);
quickSort3(arr, middle+1, right);
}
}
private int getMiddle(int[] arr, int left, int right) {
int base = arr[left];//以左侧为基数
int index = left;//基数下标
while(left<right){
while(left<right&&arr[right]>=base){
right--;
}
arr[index] = arr[right];//将基数所在下标对应的值改为找到的比基数小的值
arr[right] = base;//将找到的比基数小的位置的值改为基数
index = right;//修改基数下标
while(left<right&&arr[left]<=base){
left++;
}
arr[index] = arr[left];
arr[left] = base;
index = left;
}
return index;
}
写法二
private void quickSort3(int[] arr, int left, int right) {
if(left<right){
int base = arr[left];
int middle = left;//记录基数的下标
while(left<right){
while(left<right&&arr[right]>=base){
right--;
}
arr[middle] = arr[right];//将基数所在下标对应的值改为找到的比基数小的值
middle = right;//修改基数所在的下标位置
arr[right] = base;//将找到的比基数小的位置的值改为基数的值
while(left<right&&arr[left]<=base){
left++;
}
arr[middle] = arr[left];
middle = left;
arr[left] = base;
}
//运用分治法的思想对数组进行递归。
quickSort3(arr, left, middle-1);
quickSort3(arr, middle+1, right);
}
}