一淆游、快速排序(遞歸)
// left right為數(shù)組第0個和最后一個索引
public int[] quicksort(int[] nums, int left, int right){
if(left > right) return nums;
int i = left ;
int j = right ;
int tmp = nums[left];
// 找到數(shù)組中小于tmp和大于tmp的下標索引
while(i != j){
// 先從右向左查找小于tmp的下標索引
while(i < j && nums[j] >= tmp) j--;
// 先從左向右查找大于tmp的下標索引
while(i < j && nums[i] <= tmp) i++;
if(i < j){
int tp = nums[i];
nums[i] = nums[j];
nums[j] = tp;
}
}
// 查找成功后,分治處理tmp左右兩部分
nums[left] = nums[i];
nums[i] = tmp;
quicksort(nums, left, i - 1);
quicksort(nums, i + 1, right);
return nums;
}
思考:
- 為什么先從右向左(先從左向右怎樣寫)接校?
- 為什么nums[j] >= tmp和nums[i] <= tmp需要等號心赶?