Sort colors 和 rainbow sort 彩虹排序的java实现

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的问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值