荷兰旗问题(三色旗排序)

来源:互联网 发布:免签约支付系统源码 编辑:程序博客网 时间:2024/04/28 04:04

摘要:

荷兰旗问题是三色排序,即某一组数据,元素的值只能为a,b ,c。把这组数据按照a, b, c的顺序排序。

本文介绍了一种时间复杂度为O(n),空间复杂度O(1)的算法。


1. 问题描述

某盒子中有n个球,每个球的颜色可以是红、蓝、白,现在要求把球按照红、蓝、白的顺序摆放。这个问题叫做荷兰旗问题(荷兰旗由红、蓝、白三色组成)。


对问题的抽象:

一数列Data中含有n个元素:

Data = {A1, A2, A3, A4........, An}

Ai 属于{a, b, c}

要求:把Data按照a, b, c的顺序排列

Data = {a, a, ... b, b, b, ...., c,c,c...}


2. 问题分析

//    aaa bbbbbb xxxx ccccc

//            |              |        |    

//         p_b      p_ch  p_c 
p_b : 第一个b的位置
p_c : 第一个c的位置

p_ch: 当前处理的字符位置


具体过程如下:

绿色:要处理的字符

红色:交换字符


3. 算法实现

#include <stdio.h>#include <stdlib.h>#include <time.h>inline void Swap( char *ch1, char *ch2 ){char tmp;tmp = *ch1;*ch1 = *ch2;*ch2 = tmp;}void PartABC( char *data, int i_size){char *p_b = data;//第一个b的位置 char *p_c = data+i_size-1;//第一个c的位置 char *p_ch = data;//当前处理的字符位置 //aaa bbbbbb xxxx ccccc//      |      |    |     //     p_b    p_ch  p_c    while( p_ch != p_c ) {if( *p_ch == 'b' )//取第一个非b{          p_ch++;    continue;}else if( *p_ch == 'a' )//取到a 和 第一个b交换 {Swap( p_ch, p_b );p_ch++;p_b++;}else//取到c 和 p_c前第一个非c交换{while( *p_c == 'c' )//ccc前第一个非c p_c--;Swap( p_ch, p_c );//if( *p_ch == 'a' )//第一个非c是a,在和第一个非b交换 {Swap(p_ch, p_b);p_b++;}p_ch++;}}//while}int main(int argc, char *argv[]){srand((unsigned)time(NULL));const int ki_size = 10;//char *cv_data = "cbbabbabca";char cv_data[ki_size+1];int i;for( i=0; i<ki_size; i++ ){cv_data[i] = rand()%3 + 'a';}cv_data[i] = '\0';printf("Data is : %s\n", cv_data);PartABC(cv_data, ki_size);printf("Sorted Data is : %s\n", cv_data);return 0;}

4. 算法分析

时间复杂度:O(n)

空间复杂度:O(1)


0 0
原创粉丝点击