C语言实例——荷兰国旗问题

问题描述:

要求重新排列一个由字符R,W,B(R代表红色,W代表白色,B代表蓝色,这都是荷兰国旗的颜色)构成的数组,使得所有的R都排在最前面,W排在其后,B排在最后。

代码示例:

#include <stdio.h>void out(char a[], int n);
void RWB(char a[], int n);int main()
{char a[6] = { 'R','W','B','R','W','B' };int an = 6;char b[5] = { 'W','R','B','B','R' };int bn = 5;RWB(a, an);RWB(b, bn);out(a, an);out(b, bn);
}void out(char a[], int n)
{int i;for (i = 0; i < n; i++) {printf("%c\t", a[i]);}printf("\n");
}void RWB(char a[], int n)
{int f, l;char x;int i = 0;    f = -1, l = n;while (i != l) {if (a[i] == 'R') {f++;x = a[i];a[i] = a[f];a[f] = x;i++;    }else if (a[i] == 'W') {i++;}else if (a[i] == 'B') {l--;x = a[i];a[i] = a[l];a[l] = x;}}
}

运行结果

解题思路

由题可知,拍好后的数组应该为三个区域,分别是’R’区域,‘W’区域,’B’区域。所有的‘R’都在’W’区域左边界开始左边,所有的‘B’都在’W’区域右边界开始右边。
所以,定义两个下标 f 和 l 。
f表示’W‘所在区域的最左边界,并初始化为(-1);
l表示最右边界,并初始化为(数组长度+1)
接下来只需要将’R’排在f的左边,‘B’排在l的右边。

遍历数组并判断当前元素
若元素为‘R’:让左边界(f)往右移动一个单元,将当前数组元素与左边界所指向的数组元素交换。遍历下一个数组元素。

若元素为’W‘:l与f不变,遍历下一个数组元素。

若元素为’B’:让右边界(l)往左移动一个单元,将当前数组元素与右边界所指向的数组元素交换。让索引i停留原位再次检查被交换来的数组元素。

若当前数组下标等于右边界时,排序完成。

C语言实例——荷兰国旗问题相关推荐

  1. Algorithm:C+语言实现之数组相关算法(和为定值的两个数、和为定值的m个数、荷兰国旗、长度为2n的洗牌算法、任意长度数组的洗牌算法)

    Algorithm:C+语言实现之数组相关算法(和为定值的两个数.和为定值的m个数.荷兰国旗.长度为2n的洗牌算法.任意长度数组的洗牌算法) 目录 数组 1.寻找和为定值的两个数 2.和为定值的m个数 ...

  2. C语言 荷兰国旗解法

    /********************************************* 荷兰国旗: 1,分别定义i,j,t,i最小下标,j最大下标,t从头遍历到j的下标. 2,如果t指向的球是0 ...

  3. 二维数组c语言矩阵加法,C 语言实例 – 两个矩阵相加 - C 语言基础教程

    C 语言实例 使用多维数组将两个矩阵相加. #include int main(){ int r, c, a[100][100], b[100][100], sum[100][100], i, j; ...

  4. python单链表实现荷兰国旗问题_这道荷兰旗问题,我面试时遇到三次!

    01.题目示例 "荷兰国旗问题" 是计算机科学中的一个经典题目,它是由Edsger Dijkstra提出的.荷兰国旗由红.白.蓝三色组成. 荷兰国旗问题:现在有若干个红.白.蓝三种 ...

  5. 荷兰国旗 Flag of the Kingdom of the Netherlands

    问题描述:现有n个红白蓝三种不同颜色的小球,乱序排列在一起,请通过两两交换任意两个球,使得从左至右的球依次为红球.白球.蓝球.这个问题之所以叫做荷兰国旗,是因为将红白蓝三色的小球弄成条状物,并有序排列 ...

  6. C 语言实例 - 计算自然数的和

    C 语言实例 - 计算自然数的和自然数是指表示物体个数的数,即由0开始,0,1,2,3,4,--一个接一个,组成一个无穷的集体,即指非负整数. 实例 - 使用 for #include <std ...

  7. C语言实例第6期:反转字符串

    C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C ...

  8. C语言实例第5期:在控制台打印100-200之间的所有素数

    C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C ...

  9. C语言实例第4期:交换数组中最大数和最小数的位置

    C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C ...

  10. C语言实例第3期:在控制台打印出著名的杨辉三角

    C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C ...

最新文章

  1. android view自定义
  2. linux内核syscall_define6,Syscall系统调用Linux内核跟踪
  3. 排序算法c语言和oc实现的,几种常用的排序算法,OC实现
  4. SDR、DDR、QDR存储器的比较
  5. java ls_linux ls 命令
  6. 深入理解分布式技术 - 消息队列使用场景
  7. php如何实现读取网易有道词典输出单词的xml格式并且转化为html形式
  8. Webservice开发之xsd文件示例代码
  9. 【飞秋】微软简化Visual Studio 非程序员也能开发软件
  10. 超好看倒计时特效单页html模板源码下载
  11. 【Scala】Scala的安装以及创建Scala项目的详细步骤
  12. Spotlight on unix 安装
  13. 数据库链、物化视图、高级复制方面
  14. Rocketmq技术分享
  15. 秒懂MOS管选型技巧
  16. 2020编程入门先学什么
  17. Unity shader护盾特效
  18. linux配置https不安全链接,配置HTTPS证书后,浏览器出现不安全提示的解决方法
  19. Ubuntu 使用 create_ap 开启 wifi 热点
  20. C++栈的初始化,入栈,出栈,获取栈顶元素等操作

热门文章

  1. Mac 上使用vim 快捷键
  2. 假设检验 python_数据清洗、假设检验
  3. 运行c语言程序显示已停止运行程序,c – “此应用程序已请求运行时以不寻常的方式终止它.”...
  4. w25qxx SPI读取数据出来为全FF
  5. 《码出高效:Java开发手册
  6. 2021年最值得推荐的5款在线文档制作工具,效率这块稳稳拿捏
  7. STM32 CAN波特率计算程序
  8. 《数据结构》算法与算法设计
  9. 超市商品管理系统C语言课程设计
  10. Doom启示录(二)------李乃峰所崇拜之 两个约翰!