D - 数列有序! 有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数x,请将该数插入到序列中,并使新的序列仍然有序。

各种错误 2014-04-03 12:46:40
#include <stdio.h>
int main()
{
int m,n,a,b,c,q,h,r,t;
while (scanf("%d%d",&n,&m)!=EOF)
{
int a[n+1];
if(n==0 && m==0)
break;
else
for(c=0;c<n-1;c++)
{
scanf("%d",&a[c]);
}
a[c+1]=m;
for(h=1;h<n+1;h++)
{
q=0;
for(r=0;r<n+1-h;r++)
{
if(a[r]>a[r+1])
{
t=a[r];
a[r]=a[r+1];
a[r+1]=t;
q=1;
}
}
if (q==0) break;
}
for(h=0;h<n+1;h++)
{
printf(" %d",a[h]);
}
printf("\n");
}
return 0;
}
Sample Input
3 3
1 2 4
0 0

Sample Output
1 2 3 4
我按照例子输入 但是不知道怎么回事 出来个32 求大神指导
...全文
9178 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-04-04
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试是程序员必须掌握的技能之一。
buyong 2014-04-04
  • 打赏
  • 举报
回复
二分查找。类似std::set
lm_whales 2014-04-04
  • 打赏
  • 举报
回复
这是插入排序的内循环中的内容。 直接查找,或者二分查找,然后插入适当的位置,插入前,此位置后的所有元素必须先后移。
火星守门员 2014-04-04
  • 打赏
  • 举报
回复
引用 7 楼 mxs30443 的回复:
[quote=引用 6 楼 buyong 的回复:] [quote=引用 5 楼 mxs30443 的回复:] 刚刚找了一下,题号是杭电2019.我写的代码纯粹是为了AC 就是输入一个数检测是否比X小,小则直接输出,如果第一个比X大的则先输出X,再输出数值,以后的数值只需输入输出。 不需要二分,浪费空间时间。你如果感觉别扭,你可以存在数组里输一个存一个,输完了也就存了。 附上刚写的代码

#include <stdio.h>
int main(int argc, char *argv[])
{
	int n,i,x,temp,flag;
	while(scanf("%d%d",&n,&x) && (n!=0 || x!=0))
	{   flag=0;
		if(n==0)
		{printf("%d\n",x);
		continue;}
		for(i=0;i<n;i++)
		{scanf("%d",&temp);
		if(temp<x || flag==1)
			printf("%d",temp);
		else
		    {printf("%d %d",x,temp);
			flag=1;}
		if(i!=n-1)
		printf(" ");
		}
		printf("\n");
	}
	return 0;
}
二分显然比你这个遍历比较次数少![/quote] 我一个一个读数的时候就同时再输入,四个变量,没有数组,压根没遍历,在读完数据的时候就完事了、、、、、、你的二分输入数据读完再查找、移位,再输出。[/quote]
引用 6 楼 buyong 的回复:
[quote=引用 5 楼 mxs30443 的回复:] 刚刚找了一下,题号是杭电2019.我写的代码纯粹是为了AC 就是输入一个数检测是否比X小,小则直接输出,如果第一个比X大的则先输出X,再输出数值,以后的数值只需输入输出。 不需要二分,浪费空间时间。你如果感觉别扭,你可以存在数组里输一个存一个,输完了也就存了。 附上刚写的代码

#include <stdio.h>
int main(int argc, char *argv[])
{
	int n,i,x,temp,flag;
while(scanf("%d%d",&n,&x) && (n!=0 || x!=0)) { flag=0; if(n==0) {printf("%d\n",x); continue;} for(i=0;i<n;i++) {scanf("%d",&temp); if(temp<x || flag==1) printf("%d",temp); else {printf("%d %d",x,temp); flag=1;} if(i!=n-1) printf(" "); } printf("\n"); } return 0; } 二分显然比你这个遍历比较次数少![/quote] 我一个一个读数的时候就同时在输出,四个变量,没有数组,压根没遍历,在读完数据的时候就完事了、、、、、、你的二分输入数据读完再查找、移位,再输出。
火星守门员 2014-04-04
  • 打赏
  • 举报
回复
引用 6 楼 buyong 的回复:
[quote=引用 5 楼 mxs30443 的回复:] 刚刚找了一下,题号是杭电2019.我写的代码纯粹是为了AC 就是输入一个数检测是否比X小,小则直接输出,如果第一个比X大的则先输出X,再输出数值,以后的数值只需输入输出。 不需要二分,浪费空间时间。你如果感觉别扭,你可以存在数组里输一个存一个,输完了也就存了。 附上刚写的代码

#include <stdio.h>
int main(int argc, char *argv[])
{
	int n,i,x,temp,flag;
	while(scanf("%d%d",&n,&x) && (n!=0 || x!=0))
	{   flag=0;
		if(n==0)
		{printf("%d\n",x);
		continue;}
		for(i=0;i<n;i++)
		{scanf("%d",&temp);
		if(temp<x || flag==1)
			printf("%d",temp);
		else
		    {printf("%d %d",x,temp);
			flag=1;}
		if(i!=n-1)
		printf(" ");
		}
		printf("\n");
	}
	return 0;
}
二分显然比你这个遍历比较次数少![/quote] 我一个一个读数的时候就同时再输入,四个变量,没有数组,压根没遍历,在读完数据的时候就完事了、、、、、、你的二分输入数据读完再查找、移位,再输出。
buyong 2014-04-04
  • 打赏
  • 举报
回复
引用 5 楼 mxs30443 的回复:
刚刚找了一下,题号是杭电2019.我写的代码纯粹是为了AC 就是输入一个数检测是否比X小,小则直接输出,如果第一个比X大的则先输出X,再输出数值,以后的数值只需输入输出。 不需要二分,浪费空间时间。你如果感觉别扭,你可以存在数组里输一个存一个,输完了也就存了。 附上刚写的代码

#include <stdio.h>
int main(int argc, char *argv[])
{
	int n,i,x,temp,flag;
	while(scanf("%d%d",&n,&x) && (n!=0 || x!=0))
	{   flag=0;
		if(n==0)
		{printf("%d\n",x);
		continue;}
		for(i=0;i<n;i++)
		{scanf("%d",&temp);
		if(temp<x || flag==1)
			printf("%d",temp);
		else
		    {printf("%d %d",x,temp);
			flag=1;}
		if(i!=n-1)
		printf(" ");
		}
		printf("\n");
	}
	return 0;
}
二分显然比你这个遍历比较次数少!
火星守门员 2014-04-04
  • 打赏
  • 举报
回复
刚刚找了一下,题号是杭电2019.我写的代码纯粹是为了AC 就是输入一个数检测是否比X小,小则直接输出,如果第一个比X大的则先输出X,再输出数值,以后的数值只需输入输出。 不需要二分,浪费空间时间。你如果感觉别扭,你可以存在数组里输一个存一个,输完了也就存了。 附上刚写的代码

#include <stdio.h>
int main(int argc, char *argv[])
{
	int n,i,x,temp,flag;
	while(scanf("%d%d",&n,&x) && (n!=0 || x!=0))
	{   flag=0;
		if(n==0)
		{printf("%d\n",x);
		continue;}
		for(i=0;i<n;i++)
		{scanf("%d",&temp);
		if(temp<x || flag==1)
			printf("%d",temp);
		else
		    {printf("%d %d",x,temp);
			flag=1;}
		if(i!=n-1)
		printf(" ");
		}
		printf("\n");
	}
	return 0;
}
孤雲独去闲 2014-04-03
  • 打赏
  • 举报
回复

for(c=0;c<n-1;c++)
    {
      scanf("%d",&a[c]);
    }
    a[c+1]=m;
这是给数组赋值的吧? 这里赋值有错误,改为

for(c=0;c<n;c++)
    {
      scanf("%d",&a[c]);
    }
    a[c]=m;
就行了! 下面两个for循环是排序的吧,但是题目都说了数组已经是有序的了,就不必再重新排序了,直接查找插入就行了吧。

33,317

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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