类荷兰国旗问题的解决<1>

原创 2018年04月16日 22:50:45

问题:现有一个数组a[]={3,2,5,8,4,7,6,9};

设有一个数num,要求数组a中的元素大于num的排在数组右边,小于num的排在数组左边,等于num的排在数组中间;

要求:空间复杂度为O(1)    时间复杂度为O(n)

//原荷兰国旗问题是:现有红白蓝三个不同颜色的小球,乱序排列在一起,请重新排列这些小球,使得红白蓝三色的同颜色的球在一起。这个问题之所以叫荷兰国旗问题,是因为我们可以将红白蓝三色小球想象成条状物,有序排列后正好组成荷兰国旗。

可得知此二问题为同等道理,不同的体现;

我们可以想到最最清晰思路为:直接将此数组按升序排列自然可以达到题目要求。

现我有此想法可描述为:

<1>:遍历数组,并计算大于num的个数为righ,小于num的个数为left,等于num的数字个数为mid;

<2>:遍历数组,若数字小于num便与数组从a[0]到a[left]的数交换;同理交换等于num,大于num的数;

代码实现为:

#include <stdio.h>
int main()
{
int a[8] = {3, 2, 5, 8, 6, 4, 7, 9};
int i, left=0, mid=0, right=0, j;
int num = 5;
for (i = 0; i <= 7; i++)
{
if (a[i] < num)
left++;
if (a[i] == num)
mid++;
if (a[i] > num)
right++;
}
printf("%d %d %d ",left,mid,right);
printf("\n");
for (i = 0, j = 0; i <= 7 ; i++)
{
if (a[i] < num)
{
int t = a[i];
a[i] = a[j];
a[j] = t;
j++;
}
}
for (i = left, j = left; i <= 7; i++)
{
if (a[i] == num)
{
int t = a[i];
a[i] = a[j];
a[j] = t;
j++;
}
}
for (i = 0; i <= 7; i++)
printf("%d ", a[i]);
}

此代码显然可以优化,下次将分享优化后的代码。

Number类

-
  • 1970年01月01日 08:00

小程序:荷兰国旗问题 (大小写字母数字排序问题)包含代码

http://www.cnblogs.com/sharpfeng/archive/2012/09/05/2671630.html1.问题描述:我们将乱序的红白蓝三色小球排列成有序的红白蓝三色的同颜色在...
  • oMengLiShuiXiang1234
  • oMengLiShuiXiang1234
  • 2015-10-27 09:43:36
  • 1081

算法学习-荷兰国旗问题

题目 现有红、白、蓝三个不同颜色的小球,乱序排列在一起,请重新排列这些小球,使得红白蓝三色的同颜色的球在一起。 问题分析 问题转换为:给定数组A[0...N-1],元素只能取0、1、2三个...
  • HelloNiGeSB
  • HelloNiGeSB
  • 2016-12-06 11:27:39
  • 632

三色排序问题/(荷兰国旗问题)(C++版)

题目: 有一个只由0,1,2三种元素构成的整数数组,请使用交换、原地排序而不是使用计数进行排序。 给定一个只含0,1,2的整数数组A及它的大小,请返回排序后的数组。 算法复杂度: ...
  • u013575812
  • u013575812
  • 2015-11-23 21:51:49
  • 1049

查找排序实战---荷兰国旗问题(leetcode 75)

问题描述:leetcode 75 荷兰国旗问题 有一个数组,存储着三种颜色值红、白、蓝,排序来使得相同的颜色都靠在一起,按红、白、蓝的颜色排序。 为了方便,这里使用0、1、2分别代表红、白。蓝。问题...
  • will130
  • will130
  • 2015-05-28 10:29:19
  • 766

[算法系列之十一]荷兰国旗问题

【问题】 现有红白蓝三个不同颜色的小球,乱序排列在一起,请重新排列这些小球,使得红白蓝三色的同颜色的球在一起。这个问题之所以叫荷兰国旗问题,是因为我们可以将红白蓝三色小球想象成条状物,有序排列后正好组...
  • SunnyYoona
  • SunnyYoona
  • 2015-02-04 18:17:56
  • 3376

荷兰国旗问题的C++实现

  • 2013年03月04日 01:04
  • 503B
  • 下载

三色球和荷兰国旗问题 分析 c语言代码详解

通过前面的分析得知,这个问题,类似快排中partition过程。只是需要用到三个指针,一前begin,一中current,一后end,俩俩交换。 current遍历,整个数组序列,cur...
  • yf0811240333
  • yf0811240333
  • 2014-08-04 15:56:53
  • 1140

C解决荷兰国旗问题

  • 2017年07月10日 20:10
  • 510B
  • 下载
收藏助手
不良信息举报
您举报文章:类荷兰国旗问题的解决<1>
举报原因:
原因补充:

(最多只允许输入30个字)