快速排序
主要思想是分治,寻找基点,使左右有序
- 使用左右指针交换,不能等于
public static void quick(int[] nums,int l,int r){
if(l>=r) return;
int target = nums[l];
int i = l;
int j = r;
while(i<j){
while(i<j&&nums[i]<=target){
i++;
}
while(j>i&&nums[j]>target){
j--;
}
if(i<j){
int t = nums[i];
nums[i] = nums[j];
nums[j] = t;
}
}
quick(nums,l,j);
quick(nums,j+1,r);
}
- 挖空填充,从后向前遍历
public static void sort(int[] a, int low, int high) {
//已经排完
if (low >= high) {
return;
}
int left = low;
int right = high;
//保存基准值
int pivot = a[left];
while (left < right) {
//从后向前找到比基准小的元素
while (left < right && a[right] >= pivot)
right--;
a[left] = a[right];
//从前往后找到比基准大的元素
while (left < right && a[left] <= pivot)
left++;
a[right] = a[left];
}
// 放置基准值,准备分治递归快排
a[left] = pivot;
sort(a, low, left - 1);
sort(a, left + 1, high);
}