題目 顏色分類
給定一個包含紅色、白色和藍色,一共 n 個元素的數組,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色、白色、藍色順序排列。
此題中,我們使用整數 0、 1 和 2 分別表示紅色、白色和藍色。
注意:
不能使用代碼庫中的排序函數來解決這道題。
來源:力扣(LeetCode)
思想
- 利用快速排序的一次劃分思想,第一次劃分將值爲0的元素放在非0元素之前,並且返回分界下標。將分界下標後的子數組進行劃分,將值爲1的元素放在非1的元素之前。
- 時間複雜度爲O(n),空間複雜度爲O(1)
代碼
//使用雙指針,思想類似於快排中的partition 劃分
void swap(int *a,int *b){
int tmp=*a;
*a=*b;
*b=tmp;
}
int part(int flag,int *nums,int low,int high,int numsSize){
while(low<high){
while(low<high&&nums[low]==flag) low++;
swap(&nums[low],&nums[high]);
while(low<high&&nums[high]!=flag) high--;
swap(&nums[high],&nums[low]);
}
//返回調整後 數組中不等於flag元素的第一個下標或最後一個元素的下標
if(low<numsSize&&nums[low]==flag)
return low+1;
return low;
}
void sortColors(int* nums, int numsSize){
if(numsSize==0||numsSize==1)
return ;
int low=0,high=numsSize-1;
//part劃分只能劃分出兩個區間,所以要劃分出三種區間,應該進行兩次劃分
low=part(0,nums,low,high,numsSize);
part(1,nums,low,high,numsSize);
}