快排的思想是递归。一趟下来,比基数小的都在基数的左边,比基数大的都在基数的右边,然后分别对基数左边的数进行递归,对右边的数进行递归;当需要递归的元素只有一个时,结束递归。
public class QuickSort {
public static void main(String[] agrs){
int[] arr = {2,1,4,3,4};
quickSort(arr, 0, arr.length-1);
for(int a : arr){
System.out.println(a);
}
}
public static void quickSort(int[] arr, int left, int right){
//不再递归的判断
if(left >= right){
return;
}
int s = partition(arr,left,right);
//s的位置是不变的
quickSort(arr, left, s-1);
quickSort(arr, s + 1, right);
}
public static int partition(int[] arr, int left, int right){
//假设基准值是第一个元素
int i = left;
int jizhu = arr[left];
while(left < right){
//大于等于进入,否则right加不了。右指针找比自己小的
while(left < right && arr[right] >= jizhu){
right--;
}
//小于等于进入,否则left永远动不了。左指针找比自己大的
while(left < right && arr[left] <= jizhu){
left++;
}
//把找到的比自己打的和比自己小的交换一下位置
swap(arr, left, right);
}
swap(arr, i, left);
return left;
}
public static void swap(int[] arr, int i, int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}