快速排序之荷兰国旗问题

描述  

       荷兰国旗有三横条块构成,自上到下的三条块颜色依次为红、白、蓝。现有若干由红、白、蓝三种颜色的条块序列,要将它们重新排列使所有相同颜色的条块在一起。本问题要求将所有红色的条块放最左边、所有白色的条块放中间、所有蓝色的条块放最右边。

3种颜色(0,1,2)在一个数组里,每次只可交换一次,扫描一边后,三种颜色自然分开,应为颜色为:红,白,蓝,(荷兰国旗的颜色)所也叫荷兰国旗问题!

1020112021

数据如上面所示 要求进行排序。时间复杂度O(n)

输出结果为:

0001111222

分析:

    这个问题就是一个排序问题。

    需要把小于1的放在前面,1放在中间,2放在最后。,

第一种方法(并不是今天最终的方法,虽然是O(n)但是不是最好的)

统计法:

先跑一遍数组,统计出来有几个1,几个0,几个2;

最后在把数依次放进去。

代码如下:(注释很清楚大家一定能看懂)

#include<stdio.h>
int main(void)
{
int a[]={1,0,2,0,1,1,2,0,2,1};
int length=sizeof(a)/sizeof(int);//求数组长度;
int i,l=0,m=0,n=0,x,y;//定义一堆变量 
int flag=1;//给出flag 
for(i=0;i<length;i++)
{
if(a[i]<flag)
{
l++;//统计0的个数 
x=a[i];//把0给x 
}
else if(a[i]==flag)
m++;//统计一的个数 
else
{
n++;//2的个数 
y=a[i];//把2给y 
}

//下面就是装数的过程: 
for(i=0;i<l;i++)
a[i]=x;
for(i;i<l+m;i++)
a[i]=flag;
for(i;i<length;i++)
a[i]=y;
//输出
printf("输出结果是:\n"); 
for(i=0;i<length;i++)
printf("%4d",a[i]);
return 0;

}

第二种方法:(就是今天的正餐了)

我们定义三个指针,一个头,一个尾,一个用来遍历;

i

102011202 1

left                                                                                                                                                                                           right

i每找到一个小于flag的数,就和left交换,然后left++

i每找到一个大于flag的数,就和right交换,然后right--

大于的放后面,小于的放前面,等于的自然就放在中间了;

代码如下:(注释很清楚,有问题的地方我都详细注释了)

#include<stdio.h>
//交换函数 
void exchange(int &x,int &y)// 这里一定要传&x,&y,把他们的地址传来 
{
int t;
t=x;
x=y;
y=t;
}
int main(void)
{
int a[]={1,0,2,0,1,1,2,0,2,1};
int length=sizeof(a)/sizeof(int);//求数组长度;
int flag=1; 
int i=0,left=0,right=length-1;//放上左右指针 
while(i<right+1)//当I小于右边的时候结束 
{
if(a[i]<flag)
{
exchange(a[i],a[left]);//交换 
i++;//i跑 
//因为从左边开始跑;
//交换之后的数一定是小于或者等于flag的
//要是大于 就一定 交换过了 
left++;//左指针加一 
}
else if(a[i]==flag)
i++;//直接跑 
else
{
exchange(a[i],a[right]);
right--; //右指针减一
//这里为什么没有i++呢?
//因为你交换之后的数你还没有判断呢
//只有当它小于或者等于的时候才能++ 
}
}
//输出
printf("输出结果是:\n"); 
for(i=0;i<length;i++)
printf("%4d",a[i]);
return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/28557.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从糖尿病捆绑支付看荷兰整合医疗

来源:中国数字科技馆 所谓捆绑支付模式,是指对于患有特定疾病的患者,在涉及多个照护提供方的时候,通过单一途径即可支付所接受的所有服务。在荷兰,随着老年人口及慢性疾病患者的增加,整合医疗开始受到政策决策者和保健提供者的关注,并将整合医疗定位为有前瞻性的、多学…

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

摘要&#xff1a; 荷兰旗问题是三色排序&#xff0c;即某一组数据&#xff0c;元素的值只能为a,b ,c。把这组数据按照a, b, c的顺序排序。 本文介绍了一种时间复杂度为O&#xff08;n&#xff09;&#xff0c;空间复杂度O&#xff08;1&#xff09;的算法。 1. 问题描述 某…

荷兰国旗问题(分三块)

在说 “荷兰国旗” 问题之前&#xff0c;首先来看一个引例。 给定一个数组arr&#xff0c;和一个数num&#xff0c;请把小于等于num的数放在数组的左边&#xff0c;大于num的数放在数组的右边。要求额外空间复杂度O(1&#xff09;,时间复杂度 O(N&#xff09; 分析&#xff1…

荷兰国旗问题

Cousera Algorithms PartI第二周课后问答题&#xff0c;有这样一道题&#xff0c;当时没什么想法&#xff0c;直到学了第三周的归并排序&#xff0c;才弄明白要怎么做&#xff0c;这里记录一下自己的想法与最终代码。 问题描述 简而言之&#xff0c;这道题就是有红白蓝三种颜…

算法:荷兰国旗问题

什么是荷兰国旗问题 荷兰国旗是由红白蓝3种颜色的条纹拼接而成&#xff0c;如下图所示&#xff1a; 假设这样的条纹有多条&#xff0c;且各种颜色的数量不一&#xff0c;并且随机组成了一个新的图形&#xff0c;新的图形可能如下图所示&#xff0c;但是绝非只有这一种情况&am…

快排-荷兰国旗

在使用partition-exchange排序算法时&#xff0c;如快速排序算法&#xff0c;我们会遇到一些问题&#xff0c;比如重复元素太多&#xff0c;降低了效率&#xff0c;在每次递归中&#xff0c;左边部分是空的(没有元素比关键元素小)&#xff0c;而右边部分只能一个一个递减移动。…

BUUCTF 荷兰宽带数据泄露

题目 RouterPassView RouterPassView官方下载-RouterPassView中文免费版-华军软件园 ​ RouterPassView,大多数现代路由器允许您备份到一个文件路由器的配置&#xff0c;然后从文件中恢复配置时的需要。路由器的备份文件通常包含了像您的ISP的用户名重要数据/密码&#xff0c…

荷兰国旗问题以及快速排序

文章目录 一、荷兰国旗问题1、啥是荷兰国旗问题2、荷兰国旗问题的抽象3、解决的思路4、详细的参考代码 二、快速排序1、啥是快排&#xff08;排序流程&#xff09;2、抽象后的快排流程3、详细的参考代码 大家好&#xff0c;我是周一。 最近几篇算法&#xff0c;我们都是聊的归…

拍卖理论 英式拍卖 和 荷兰式拍卖 是什么

拍卖理论 源自Vickrey&#xff08;1961&#xff09;的早期研究&#xff0c;其因此获得1996年的诺贝尔经济学奖。 目标一般为&#xff1a;拍卖人的收益最大化、社会的整体效率最优化 对科研和商业方面有非常价值 英式拍卖 又称增价拍卖。拍品的起拍价格即最低期望价格&#…

谈腾讯地图web api如何实现类似百度地图内置的城市切换、关键字输入提示功能

PC WEB端新增客户的时候需要填写客户地址和联系人信息&#xff0c;包括&#xff1a;省市区、街道、详细地址和经纬度以及联系人、固话和移动电话。获取客户地址信息之前用的是百度地图&#xff0c;由于小程序中客户拜访时&#xff0c;需要对客户进行定位、距离计算&#xff0c;…

数学系列 (二)自然数、分数、小数、算数、代数

从无到有 数的概念 出生不久的孩子你觉的他认识1、2、3类似的数字吗&#xff1f;应该都不知道&#xff0c;可见数字的概念也是随着我们人类成长逐渐认识到的&#xff0c;英国经济学创立者亚当斯密说“数是人类在精神上制造出来的最抽象的概念”&#xff0c;属于逻辑思维里面的…

html 省份,城市 选择器附效果图

开发交流QQ群: 173683895 173683895 526474645 人满的请加其它群 效果图&#xff1a; 源码&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><link href"https://cdn.bootcss.com/bootstrap/3.3.7/css/boots…

深圳前海和后海的地理位置划分

前海后海的地理位置 前海和后海主要是相对于珠江口而言的&#xff0c;面向珠江口的为前海&#xff0c;背向珠江口的为后海或面向深圳湾的为后海。 前海知识拓展 https://www.sohu.com/a/490380431_124752

Python实现天气查询功能(外加Excel技巧)

昨天在网上发现了一个非常方便的天气API&#xff0c;就用Python试着用了一下。参数是挺少的&#xff0c;用起来也方便&#xff0c;但是那个城市代码确实是搞了我好长时间。 一、介绍 我们先来看一下实现的程序有什么功能&#xff1a; 功能也是非常简单的&#xff0c;输入城市…

找零钱问题——贪心算法

蓝桥杯——算法训练——找零钱 有n个人正在饭堂排队买海北鸡饭。每份海北鸡饭要25元。奇怪的是&#xff0c;每个人手里只有一张钞票&#xff08;每张钞票的面值为25、50、100元&#xff09;&#xff0c;而且饭堂阿姨一开始没有任何零钱。请问饭堂阿姨能否给所有人找零&#xf…

c语言 贪心算法 找零钱,贪心算法-找零钱(C#实现)

找零钱这个问题很清楚,无非就是始终拿可以取的最大面值来找,最后就使得张数最小了,这个实现是在假设各种面值足够多的情况下。 首先拖出一个界面来,最下面是一个listbox控件 对应的代码:问题比较简单,有注释 using System; using System.Collections.Generic; using Syst…

仿秒秒测日历页面和部分功能

秒秒测&#xff1a; 这里的农历和宜忌我们用的是这个lunar类库 <?phprequire Lunar.php;use com\nlf\calendar\Foto; use com\nlf\calendar\LunarYear; use com\nlf\calendar\util\HolidayUtil; use com\nlf\calendar\Lunar; use com\nlf\calendar\Solar;// 实例化 $sol…

蓝桥杯-算法训练-找零钱

问题描述   有n个人正在饭堂排队买海北鸡饭。每份海北鸡饭要25元。奇怪的是&#xff0c;每个人手里只有一张钞票&#xff08;每张钞票的面值为25、50、100元&#xff09;&#xff0c;而且饭堂阿姨一开始没有任何零钱。请问饭堂阿姨能否给所有人找零&#xff08;假设饭堂阿姨足…

蓝桥杯全排列扩展(找零钱问题-java详解)

题目&#xff1a; 有n个人正在饭堂排队买海北鸡饭。每份海北鸡饭要25元。奇怪的是&#xff0c;每个人手里只有一张钞票&#xff08;每张钞票的面值为25、50、100元&#xff09;&#xff0c;而且饭堂阿姨一开始没有任何零钱。请问饭堂阿姨能否给所有人找零&#xff08;假设饭堂…

想搞钱,先培养商业思维!

昨天谈借助 ChatGPT 挣点房贷钱的时候&#xff0c;看评论区大家留言的时候&#xff0c;发现很多人不知道这个东西可以赚钱&#xff0c;或者说知道这个东西且也做了功课&#xff0c;无奈太忙最后也没搞到钱。 可以看到&#xff0c;大家的问题&#xff0c;归根于自己有没有商业思…