[LeetCode] 荷兰国旗问题 Sort Colors

1. 荷兰国旗问题

类似问题:单链表快速排序

Write a function that takes an array A and a beginning indexbeginand an ending indexendinto A, and rearranges the elements such that all elements less than A[begin] appear first, followed by elements equal to A[begin], followed by elements greater than A[begin]. Your algorithm should have O(1) space complexity and O(end-begin) time complexity.

这个问题思路如下:

可以把数组分成四组:小于组(元素值小于A[begin]的部分),等于组(元素值等于A[begin]的部分),未分组(元素值有待和A[begin]比较的部分),大于组(元素值大于A[begin]的部分)。

具体代码如下. 下面的代码以数组的第一个元素为pivot元素,并且假设这个pivot元素的值是中值,既非最大值,亦非最小值,而是中值。请看本篇文章的第二个问题如何去掉这个假设。(注意:下面的代码可以用于quick sort的partition函数)

int partition(int arr[], int s, int e)
{
	// i: index to the first element in the middle section
	// j: index to the element just before the greater-than section
	// k: index to the first element of the uncompared section
	int i=s, j=e, k=s+1;
	while(k<=j)
	{
		if(arr[i]==arr[k])
			k++;
		else if(arr[i]<arr[k])
			swap(arr[k], arr[j--]);
		else if(arr[i]>arr[k])
			swap(arr[i++],arr[k++]);
	}
}

------------------------------------------------------

2. Sort Colors

Given an array with n objects colored red, white or blue, sort them so that objects of the same color are adjacent, with the colors in the order red, white and blue. Here, we will use the integers 0, 1, and 2 to represent the color red, white, and blue respectively. Note: You are not suppose to use the library's sort function for this problem.

Follow up: A rather straight forward solution is a two-pass algorithm using counting sort. First, iterate the array counting number of 0's, 1's, and 2's, then overwrite array with total number of 0's, then 1's and followed by 2's. Could you come up with an one-pass algorithm using only constant space?

可以借助荷兰国旗问题的算法,对0、1、2进行排序。

void sortColors(int arr[], int n) {

    // j: index to the element just before the greater-than section  
    // k: index to the first element of the uncompared section  
    int i=0, j=n-1, k=0;  
    while(k<=j)  
    {  
        if(1==arr[k])  
            k++;  
        else if(1<arr[k])  
            swap(arr[k], arr[j--]);  
        else if(1>arr[k])  
            swap(arr[i++],arr[k++]);  
    }  
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值