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++]);
}
}