荷兰国旗问题--快速排序的变种
2012-10-04 17:15
330 查看
1.问题描述:
我们将乱序的红白蓝三色小球排列成有序的红白蓝三色的同颜色在一起的小球组。这个问题之所以叫荷兰国旗,是因为我们可以将红白蓝三色小球想象成条状物,有序排列后正好组成荷兰国旗。
2.问题分析:
这个问题我们可以将这个问题视为一个数组排序问题,这个数组分为前部,中部和后部三个部分,每一个元素(红白蓝分别对应0、1、2)必属于其中之一。由于红、白、蓝三色小球数量并不一定相同,所以这个三个区域不一定是等分的,也就是说如果我们将整个区域放在[0,1]的区域里,由于三色小球之间数量的比不同(此处假设1:2:2),可能前部为[0,0.2),中部为[0.2,0.6),后部为[0.6,1]。我们的思路如下:将前部和后部各排在数组的前边和后边,中部自然就排好了。具体的:设置两个标志位begin和end分别指向这个数组的开始和末尾,然后用一个标志位current从头开始进行遍历:
1)若遍历到的位置为0,则说明它一定属于前部,于是就和begin位置进行交换,然后current向前进,begin也向前进(表示前边的已经都排好了)。
2)若遍历到的位置为1,则说明它一定属于中部,根据总思路,中部的我们都不动,然后current向前进。
3)若遍历到的位置为2,则说明它一定属于后部,于是就和end位置进行交换,由于交换完毕后current指向的可能是属于前部的,若此时current前进则会导致该位置不能被交换到前部,所以此时current不前进。而同1),end向后退1。
3.解决代码:
/* * ===================================================================================== * * Filename: Dutchflag.cpp * * Description: * * Version: 1.0 * Created: 02/25/2011 09:31:21 AM * Revision: none * Compiler: gcc * * Author: gnuhpc (http://blog.csdn.net/gnuhpc), warmbupt@gmail.com * * ===================================================================================== */ #include <iostream> #include <stdlib.h> using namespace std; #define N 10 void swap (int &var1, int &var2) { int temp = var1; var1 = var2; var2 = temp; } void shuffle(int *array) { int current = 0; int end = N-1; int begin = 0; while( current<=end ) { if( array[current] ==0 ) { swap(array[current],array[begin]); current++; begin++; } else if( array[current] == 1 ) { current++; } else{//When array[current] =2 swap(array[current],array[end]); end--; } } } int main(int argc, char *argv[]) { int a ; int i; for( i=0 ; i<N; i++ ) { a[i] = rand()%3; cout << a[i] << " "; } cout << endl; shuffle(a); for( int i=0 ; i<N ; i++ ) { cout << a[i] << " "; } cout << endl; return 0; }[/code]
相关文章推荐
- 荷兰国旗问题--快速排序的变种
- 算法初级02——荷兰国旗问题、随机快速排序、堆排序、桶排序、相邻两数的最大差值问题、工程中的综合排序算法
- 荷兰国旗排序问题对应的快速排序方法
- 算法初级02——荷兰国旗问题、随机快速排序、堆排序
- 数组------荷兰国旗问题(颜色排序)
- 算法--三色排序(经典的荷兰国旗问题)
- 荷兰国旗问题(三元素数组排序问题)
- 荷兰国旗问题(三元素数组排序问题)
- 三色排序(荷兰国旗问题)
- 中位数应用:输油管道问题--快速排序、改进、变种
- 奇偶数排序,荷兰国旗问题
- 三色排序问题/(荷兰国旗问题)(C++版)
- 查找排序实战---荷兰国旗问题(leetcode 75)
- 排序相关——荷兰国旗问题
- 荷兰国旗快速排序及堆排序
- 荷兰国旗问题
- 荷兰国旗问题
- 荷兰国旗问题
- 荷兰国旗问题
- 荷兰国旗问题