Sort colors 和 rainbow sort 彩虹排序的java实现
Sort colors也是leetcode上面的一道经典题目了,012分别代表3种不同的颜色,输入一个含有三种颜色的数组,我们要将其按照升序排序,方法其实也非常简单,就是利用两个指针分别指向最后一个0的应该被放置的位置和第一个2应该被放置的位置,我们遍历这个数组,遇到0就和0指针交换,遇到2就和2指针交换这样在遍历结束之后我们的数组就被排序完成了,让我们看看sort colors的java实现吧。
class SortColors{
public void sortColors(int[] nums){
if(num == null || nums.length == 0) return;
int left = 0, right = nums.lenght-1;
for(int i = 0; i <= blue; i++){
if(nums[i] == 0){
int temp = nums[i];
nums[i] = nums[red];
nums[red++] = temp;
}
else if(nums[i] == 2){
int temp = nums[i];
nums[i--] = nums[blue];
nums[blue--] = temp;
}
}
}
}
这个其实非常的简单,但是如果我们要面对一个给定K个不同颜色的数组呢?我们是不是可以有一种更加好的方法?这个就是所谓的彩虹排序rainbow Sort 。 Rainbow Sort其实更像是quicksort的变种,我们找到需要排列的颜色中间的那一个作为基准值,然后进行类似quicksort的partition,让我们看看java的实现吧。
class Sort{
// k is the number of colors
public void sortColors{int[] colors,int k}{
if(colors == null|| colors.length == 0){
return;
}
rainbowSort(colors,0,colors.length-1,0,k);
}
private void rainbowSort(int[] colors,int start,int end, int colorFrom,int colorTo){
//终止条件
if(colorFrom == colorTo){
return;
}
if(start == end){
return;
}
// 找到基准值
int colorMid = (colorFrom+colorTo)/2;
int left = start,right = end;
while(left <= right){
while(left <= right && colors[left] <= colorMid){
left++;
}
while(left <= right && colors[right] > colorMid){
right--;
}
if(left <= right){
int tmp = colors[left];
colors[left] = colors[right];
colors[right] = tmp;
right--;
left++;
}
}
rainbowSort(colors,start,right,colorFrom,colorMid);
rainbowSort(colors,left,end,colorMid+1,colorTo);
}
}
我们同样也可以使用rainbowsort来解决基础的sort color的问题。