Leetcode链接:. - 力扣(LeetCode)
快速排序:随机选一个基准数据,通过一趟排序将待排序的记录分割成独立的三部分,第一部分记录的数组小于基准数据,第二部分记录的数组等于基准数据,第三部分记录的数组大于基准数据,过程执行完,基准数据已经在数组中的正确位置,递归地进行这个过程,直到整个序列有序为止。
1.设置两个区域,分别为<区(小于基准数据num)和>区(大于基准数据num)
2.随机再数组中选一个基准数据num,遍历数组arr[i];
2.1 如果arr[i]<num,arr[i]和<区的下一个数据交换,<区右移一位,i++;
2.2 如果arr[i]=num,i++;
2.3 如果arr[i]>num,arr[i]和>区的前一个数据交换,>区左移一位,i不变。
java
class Solution {
public int[] sortArray(int[] nums) {
quickSort(nums,0,nums.length-1);
return nums;
}
public void quickSort(int[] arr ,int l,int r){
if(l<r){
//随机选取一个基准数跟r交换(基准数最好是随机选取的,减小最坏情况的可能)
swap(arr,l+(int)(Math.random() * (r-l+1)),r);
//p存放等于基准数的左右边界
int[] p=partition(arr,l,r);
quickSort(arr,l,p[0]-1); //<区
quickSort(arr,p[1]+1,r);//>区
}
}
public int[] partition(int[] arr,int l,int r){
int small = l-1;
int big =r;
while(l<big){
//arr[l]<基准数,arr[l]和arr[small]的下一个数交换,small右移一位,l加一
if(arr[l]<arr[r]){
swap(arr,++small,l++);
//arr[l]>基准数,arr[l]和arr[big]的前一个数交换,big左移一位,l不变
} else if(arr[l]> arr[r]){
swap(arr, --big,l);
//arr[l]=基准数,l加一
}else {
l++;
}
}
//交换arr[big]和基准数
swap(arr,big,r);
return new int[]{small+1,big};
}
public void swap(int[] arr, int a,int b){
int temp=arr[a];
arr[a]=arr[b];
arr[b]=temp;
}
}