超高难度的数组排序问题,完成了另开贴子多给分,我一次只能给100

sssoft 2004-07-17 02:54:45
大家好,我有一个数组排序的问题
已知数组元素个数2-100;
数组中包含的元素的值取0或者1;0至少包含两个,0与1的数量不定;
数组第一个和最后一个元素必须是0;
提供一个算法能够将其中的0和1均匀交替排布。
举例:11个。10 0 1 1 00000100000
9 0 2 1 00010001000
8个0 3个1 00100100100
7个0 4个1 01001010010
6个0 5个1 01010101010
5 0 6 1 01101010110
4 0 7 1 01101110110
3 0 8 1 01111011110
2 0 9 1 01111111110
...全文
154 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
sssoft 2004-08-09
  • 打赏
  • 举报
回复
多谢大侠们帮忙,小弟终于完成了。是用1与2进行的排列
int CBmDrawGLGJ::ArrangeIndex(int N1,int N2,AcDbIntArray & Indexes)
{
if (N2==0 && N1==0) {
return 0;
}
Indexes.setLogicalLength(0);
if (N2<=0){
for (int i=0;i<N1;i++)
Indexes.append(1);
return 1;
}
if (N1<=0) {
for (int i=0;i<N2;i++)
Indexes.append(2);
return 1;
}
int NMax=max(N1,N2);
int NMin=min(N1,N2);
Indexes.setLogicalLength(NMax+NMin);
for(int i=0;i<Indexes.length();i++){
Indexes.setAt(i,1);
}
int Count=(NMax+NMin)/2;
int SkipCount=NMax/(NMin+1);
if (NMax==NMin) SkipCount=1;
int MinCount=0;
for(i=0;i<Count;i++){
if (MinCount==int(NMin/2)) break;
if ((i+SkipCount)<Count) {
Indexes.setAt(i+SkipCount,2);
Indexes.setAt(Indexes.length()-i-1-SkipCount,2);
i+=SkipCount;
MinCount++;
}else {
break;
}
}
if (NMin%2) {
Indexes.setAt(Count,2);
}
if ( N1 < N2 ) {
for(i=0;i<Indexes.length();i++){
int index=Indexes.at(i);
if (index==1) {
Indexes.setAt(i,2);
}else{
Indexes.setAt(i,1);
}
}
}
return 1;
}
名牌大灰狼 2004-07-17
  • 打赏
  • 举报
回复
用气泡的吧.就是 0000011111111都放在一起.然后在混插起来.
sttony 2004-07-17
  • 打赏
  • 举报
回复
只要统计出0,1的个数就好直接构造
ZhangYv 2004-07-17
  • 打赏
  • 举报
回复
这不是排序的问题,直接构构造就好了。
使用分治策略,一个 有N个“0”和M个“1”的合法数组的“左右两边序列是对称的”。也就是说序列F(N,M) = F(N/2,M/2) + F~(N/2,M) {F~表示左半边的逆序列}。当N = 1时直接得出基本序列。细节部分自己补充。算法大致如此,使用分治算法
huanyun 2004-07-17
  • 打赏
  • 举报
回复
先统计数组中1的个数n
然后 根据0,1个数构造新数组
yao1982 2004-07-17
  • 打赏
  • 举报
回复
数组长度为2的时候,得1种情况; (全零)
为3的时候,得2种情况;
为4的时候,得2种情况;
为5的时候,得4种情况;
为6的时候,得6种情况;
可以归纳为 ((长度+1)/2后取整 -1) <- 再用前面的数作为2的冥指数,得出一共有多少种可能的情况;

至于算法,首先计算出循环的次数,即(长度+1)/2后取整 -1;
由于对称,可把数组从中间砍成两段,长度为循环次数;
对于左边一段首位就直接赋0,第二位随机赋予0或1,直到最后一位,循环结束;
对于右边一段,赋予左边一端的逆转数组;
对于整个数组的排列,判断数组全长为奇还是偶,奇数的话,去掉左边一段的结尾或右边一段的开头再组合;偶数的话,就直接组合;

以上是我的看法,小弟献丑了~
名牌大灰狼 2004-07-17
  • 打赏
  • 举报
回复
递归了.当然用递归.你用气泡法试试
sssoft 2004-07-17
  • 打赏
  • 举报
回复
up
sssoft 2004-07-17
  • 打赏
  • 举报
回复
up
sssoft 2004-07-17
  • 打赏
  • 举报
回复
我用递归减半算法进行了计算,但是不理想。估计是思路有问题
PiggyXP 2004-07-17
  • 打赏
  • 举报
回复
想想。。。。。

琐事缠身也没功夫仔细来考虑了呵呵

不过我承认他很难^_^
sssoft 2004-07-17
  • 打赏
  • 举报
回复
up
sssoft 2004-07-17
  • 打赏
  • 举报
回复
up
sssoft 2004-07-17
  • 打赏
  • 举报
回复
up

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧