快排-荷兰国旗

在使用partition-exchange排序算法时,如快速排序算法,我们会遇到一些问题,比如重复元素太多,降低了效率,在每次递归中,左边部分是空的(没有元素比关键元素小),而右边部分只能一个一个递减移动。结果导致耗费了二次方时间来排序相等元素。这时我们可以多分一个区,即,小于区,等于区,大于区。(传统快排为小于区和大于区)

 

下面我们通过一个经典例题来练习这种思想。

荷兰国旗问题

”荷兰国旗难题“是计算机科学中的一个程序难题,它是由Edsger Dijkstra提出的。荷兰国旗是由红、白、蓝三色组成的。

      

  现在有若干个红、白、蓝三种颜色的球随机排列成一条直线。现在我们的任务是把这些球按照红、白、蓝排序。

样例输入

3
BBRRWBWRRR
RRRWWRWRB
RBRW

样例输出

RRRRRWWBBB
RRRRRWWWB
RRWB

思路:

现在我们的思路就是把未排序时前部和后部分别排在数组的前面和后面,那么中部自然就排好了。

设置两个标志位head指向数组开头,tail指向数组末尾,now从头开始遍历:

(1)如果遍历到的位置为1,那么它一定是属于前部,于是就和head交换值,然后head++,now++;

(2)如果遍历到的位置为2,说明属于中部,now++;

(3)如果遍历到的位置为3,说明属于后部,于是就和tail交换值,然而,如果此时交换后now指向的值属于前部,那么就执行(1),tail--;

废话不多说,上代码。

#include<iostream>
#include<algorithm>
using namespace std;const int maxn = 100 + 5;int n;
string str;
int main(){cin>>n;while(n--){cin>>str;int len=str.size();int now=0,ans=0;int head=0,tail=len-1;while(now<=tail){if(str[now]=='R'){swap(str[head],str[now]);head++;now++;}else if(str[now]=='W'){now++;}else{swap(str[now],str[tail]);tail--;}}cout<<str<<endl;}return 0;
}

其实只要解题的话统计三个数量就好了,但是分三区的思想一定要有。

快排分三区以后降低了递归规模,避免了最差情况,性能得到改进。

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

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

相关文章

快排-前m大元素

描述 给定一个数组包含n个元素&#xff0c;统计前m大的数并且把这m个数从大到小输 出。 输入 第一行包含一个整数n&#xff0c;表示数组的大小。n < 100000。 第二行包含n个整数&#xff0c;表示数组的元素&#xff0c;整数之间以一个空格分开 。每个整数的绝对值不超过…

归并-求逆序数

考虑1,2,…,n (n < 100000)的排列i1&#xff0c;i2&#xff0c;…&#xff0c;in&#xff0c;如果其中存在j,k&#xff0c;满足 j < k 且 ij > ik&#xff0c; 那么就称(ij,ik)是这个排列的一个逆序。 一个排列含有逆序的个数称为这个排列的逆序数。例如排列 26345…

动态规划概述

注&#xff1a;第一次看不需要全理解&#xff0c;以后动态规划做多了&#xff0c;再回来看看&#xff0c;会有更深的理解 先符上其它文章&#xff0c;看完这篇就可以开始看这些咯。 萌新&#xff1a; …

动态规划-背包是否装满

很简单但是需要特别注意的&#xff0c;一定不要错。 背包&#xff1a; 有n 种不同的物品&#xff0c;每个物品有两个属性&#xff0c;v体积&#xff0c;c价值&#xff0c;现在给一个体积为 m 的背包&#xff0c;问最多可带走多少价值的物品。 状态转移方程 dp[i][j]max…

dp打开思路3:HDU1069 POJ3616 POJ1088

HDU 1069 题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1069 题意&#xff1a;把给定的长方体&#xff08;不限&#xff09;叠加在一起&#xff0c;叠加的条件是&#xff0c;上面一个长方体的长和宽都比下面长方体的长 和宽短&#xff1b;求这些长方体能…

输入输出外挂

板子不解释 //适用于正负整数 template <class T> inline bool scan_d(T &ret) {char c; int sgn;if(cgetchar(),cEOF) return 0; //EOFwhile(c!−&&(c<0||c>9)) cgetchar();sgn(c−)?−1:1;ret(c−)?0:(c−0);while(cgetchar(),c>0&&c&…

dp打开思路4:POJ1189 UVA12511 HDU2845 HBCPC K

POJ1189 http://poj.org/problem?id1189 怎么说呢&#xff0c;不算难&#xff0c;但是容易出问题 我一开始的思路是&#xff0c;第一个钉子只有一种情况&#xff0c;然后下面每个钉子&#xff1a;左边有钉子就加左边的情况数&#xff0c;右边有钉子就加右边的情况数&#x…

第五次课 课上代码

第五次 双重循环——排序&#xff08;复习&#xff09; While循环 Break continue 字符串&#xff08;len&#xff0c;取值改值&#xff0c;格式化&#xff09; 列表生成式 >>> for i in range(4): for j in range(4): print(i,j) 0 0 0 1 0 2 0 3 1…

第六次课 课上代码

oj的使用 Python Split 函数&#xff08;优点&#xff1a;抽象、简洁。 举例&#xff1a;str\int\float\abs 具体实现&#xff09; ninput().split(" ") 3 4 >>> print(int(n[0])int(n[1])) 7 >>> print(12345) 15 l[1,2,3,4,5] >>&g…

橙白oj18训练作业1-题解、代码

学习资料和oj如何使用加软件官方qq群739979255 oj网址&#xff1a;http://oj.acm-icpc.top/ a题&#xff1a;原题为输入两个数&#xff0c;一行&#xff0c;用空格隔开&#xff0c;因为python操作对萌新来说略难&#xff0c;改为一行一个数&#xff0c;算出ab。 思路&#x…

橙白oj18训练作业2-题解、代码

http://oj.acm-icpc.top/ a题&#xff1a;三个数字排序 可以利用sort函数排序&#xff0c;或者自己想清楚逻辑自己写&#xff0c;我给出一个正确逻辑 &#xff08;拓展冒泡和其他排序参考https://blog.csdn.net/hebtu666/article/details/81434236&#xff09; a,b,cinput(…

时间空间复杂度概述

找个时间写一写时间复杂度和一些问题分类&#xff0c;也普及一下这方面知识。 如何衡量一个算法好坏 很显然&#xff0c;最重要的两个指标&#xff1a;需要多久可以解决问题、解决问题耗费了多少资源 那我们首先说第一个问题&#xff0c;要多长时间来解决某个问题。那我们可…

二叉树遍历算法总结

文章目录前提要素深度优先搜索DFS经典遍历算法前序遍历递归版迭代版中序遍历递归版迭代版后序遍历递归版迭代版Morris遍历算法中序遍历前序遍历后序遍历广度优先搜索BFS按层遍历参考资料前提要素 本文代码用Java实现。 //二叉树节点结构 public static class TreeNode {publi…

时间复杂度 P/NP/NPC

你会经常看到网上出现“这怎么做&#xff0c;这不是NP问题吗”、“这个只有搜了&#xff0c;这已经被证明是NP问题了”之类的话。你要知道&#xff0c;大多数人此时所说的NP问题其实都是指的NPC问题。他们没有搞清楚NP问题和NPC问题的概念。NP问题并不是那种“只有搜才行”的问…

kmp1-HDU1711 HDU1686 HDU2087 HDU3746

HDU 1711 kmp模板题 http://acm.hdu.edu.cn/showproblem.php?pid1711 #include<stdio.h> #include<string.h> #define N 1000005 int s[N]; int p[N]; int next[N]; int m,n; void getnext(){int j0,k-1;next[0]-1;while(j<m){if(k-1||p[j]p[k]){j;k;next[j]…

kmp2-HDU1358 HUST1010 POJ2406 POJ2752

HDU1358 http://acm.hdu.edu.cn/showproblem.php?pid1358 先构造出 next[] 数组&#xff0c;下标为 i&#xff0c;定义一个变量 j i - next[i] 就是next数组下标和下标对应值的差&#xff0c;如果这个差能整除下标 i&#xff0c;即 i%j0 ,则说明下标i之前的字符串&#xff0…

18暑期培训总结

暑假一共直播讲了七次课&#xff0c;每次一小时到一个半小时&#xff0c;前六次讲解python主要实用语法&#xff0c;最后一次讲了学习方法和简单基础的思想和算法。由于时间有限&#xff0c;不能做到很好&#xff0c;请见谅。 学院做题网站&#xff1a;橙白oj http://oj.acm-i…

第七次课 课上代码

时间空间复杂度&#xff08;例子&#xff1a;1-n求和&#xff09; 复杂度&#xff1a;https://blog.csdn.net/hebtu666/article/details/82463970 https://blog.csdn.net/hebtu666/article/details/82465495 二分 一个数组查找某个值1 2 3 5 6 7 8 9 10 15 20。。 查找11 …

数据结构课上笔记1

第一节课复习了c语言的一些知识&#xff0c;并简单介绍了数据结构这门课程。 1、引用和函数调用&#xff1a; 1.1引用&#xff1a;对一个数据建立一个“引用”&#xff0c;他的作用是为一个变量起一个别名。这是C对C语言的一个重要补充。 用法很简单&#xff1a; int a 5; …