第一种是快排解决办法
class Solution {
public void sortColors(int[] nums) {
quickSort(nums,0,nums.length-1);
}
public void quickSort(int[] nums,int start,int end){
if (start<end){
int mid=patition(nums,start,end);
quickSort(nums,start,mid-1);
quickSort(nums,mid+1,end);
}
}
public int patition(int[] nums,int start,int end){
int index=nums[start];
while(start<end){
while(start<end && nums[end]>=index) end--;//****先end后start
nums[start]=nums[end];
while(start<end && nums[start]<=index) start++;
nums[end]=nums[start];
}
nums[start]=index;
return start;
}
}
另一种patition写法
int partition(vector<int>& nums, int low, int high) {
int pivot = nums[high], i = low, j;
for (j = low; j < high; j++) {
if (nums[j] < pivot) {
swap(nums[i], nums[j]);
i++;
}
}
swap(nums[high], nums[i]);
return i;
}
复杂度:nlog(n)
神一级的算法:
class Solution {
public void sortColors(int[] nums) {
int[] A=nums;
int n=nums.length;
int i = -1;
int j = -1;
int k = -1;
for(int p = 0; p < n; p ++)
{
//根据第i个数字,挪动0~i-1串。
if(A[p] == 0)
{
A[++k] = 2; //2往后挪
A[++j] = 1; //1往后挪
A[++i] = 0; //0往后挪
}
else if(A[p] == 1)
{
A[++k] = 2;
A[++j] = 1;
}
else
A[++k] = 2;
System.out.println(Arrays.toString(A));
}
}
}