测试:排序、数组元素划分两部分
首先写快速排序:
public int[] sortArray(int[] nums) {
quickSort(nums,0,nums.length-1);
return nums;
}
public void quickSort(int[] nums,int begin,int end){
if(begin>=end) return;
random(nums,begin,end); //随机
int center = partition(nums,begin,end);
quickSort(nums,begin,center-1);
quickSort(nums,center+1,end);
}
public void swap(int[] nums,int a,int b){
int temp = nums[a];
nums[a] = nums[b];
nums[b] = temp;
}
随机函数
public void random(int[] nums, int l, int r) {
int i =(int) ( Math.random()*(r-l+1)+l );
swap(nums, r, i);
}
其中的核心是partition函数,即将数组划分为两部分
有两种写法,第一种头尾双指针分区算法
public int partition(int[] nums,int begin,int end){
int left = begin;
int right = end;
while(left<right){
while(left<right && nums[right]>nums[begin]){
right--;
}
while(left<right && nums[left]<=nums[begin]){
left++;
}
if(left<right){
swap(nums,left,right);
}
}
swap(nums,begin,left);
return left;
}
第二种是快慢指针
public int partition(int[] nums,int begin,int end){
int slow = begin;
int fast = begin+1;
while(fast<=end){
if(nums[fast]<nums[begin]){
slow++;
swap(nums,slow,fast);
}
fast++;
}
swap(nums,slow,begin);
return slow;
}
两种方法都要注意边界的问题
两种双指针算法都可用于“基于一种标准的划分区间”问题
比如这个数组元素划分为两部分