蓝桥杯 区间k大数问题求各位解答啊。排序方面的错误,另外还有个小问题,都在注释里

若出剑 2016-04-26 03:59:38
/*蓝桥杯 区间k大数查询 */
#include<stdio.h>
int n;
int select(int l,int r,int k,int *a)
{
int i,j,t;
int b[n]; //数组大小不能做动态定义,我这样定义 为什么在dev下编译通过?n是变量啊
for(i=l;i<=r;i++)
b[i]=a[i];
for(i=l;i<r-l+1;i++)//冒泡排序算法
{
for(j=r-1;j>=i;j--)
{
if(b[j]<b[j+1])
{
t=b[j+1];
b[j+1]=b[j];
b[j]=t;
}
}
} //
for(i=l;i<=r;i++)
/*输出排序好的下标从l到r的值
发现错误处在此处 ,排序不正确,若下标从1开始,
排序结果对的,但从2开始就不对了
*/
printf("%d ",b[i]);
printf("\n");
return b[l+k-1];

}
int main()
{

int m;
int m1;
int l,r,k,i,j=0;
scanf("%d",&n);
int a[n];
int num[1000]={0};
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
scanf("%d",&m);
m1=m;
while(m--)
{
scanf("%d%d%d",&l,&r,&k);
num[j++]=select(l,r,k,a);
}
for(i=0;i<m1;i++)
printf("%d\n",num[i]);
return 0;
}
...全文
132 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-04-27
  • 打赏
  • 举报
回复
引用 2 楼 lm_whales 的回复:
不定长数组,看着好用,其实陷阱也不少 尽量不用为妙
不定长数组和vector都是语法糖。 语法糖越甜,编译调试查错越苦! 把有限的生命浪费在品尝/品鉴无穷多种的语法糖中,我认为不值当。
赵4老师 2016-04-27
  • 打赏
  • 举报
回复
在现实世界中,除时间和空间可能是无限的以外,其它任何事物都是有限的。
ArthurJava 2016-04-27
  • 打赏
  • 举报
回复
上面写错了 bool isswap = true; for(i = r -1; isswap && i >= l; --i)//冒泡排序算法 { isswap = false; for(j = l; j < i; ++j) { if(b[j]<b[j+1]) { isswap = true; t=b[j+1]; b[j+1]=b[j]; b[j]=t; } } }
lm_whales 2016-04-27
  • 打赏
  • 举报
回复
Select 可以用排序做,任何一种都可以 但是修改版 快排 是更好的选择
ArthurJava 2016-04-26
  • 打赏
  • 举报
回复
bool isswap = true; for(i = l; isswap && i < r-1; ++i)//冒泡排序算法 { for(j = l; j < r - i; ++j) { isswap = false; if(b[j]<b[j+1]) { isswap = true; t=b[j+1]; b[j+1]=b[j]; b[j]=t; } } }
若出剑 2016-04-26
  • 打赏
  • 举报
回复
没人了吗
若出剑 2016-04-26
  • 打赏
  • 举报
回复
我把数组大小 改为n+1 也不行啊。不用不定长数组,宏定义一个MAX,排序那块还是有错,,,是怎么回事?
lm_whales 2016-04-26
  • 打赏
  • 举报
回复
不定长数组,看着好用,其实陷阱也不少 尽量不用为妙
小灸舞 版主 2016-04-26
  • 打赏
  • 举报
回复
DEV是用的GCC做编译器,所以允许这样定义int a[n]; 楼主你的下标都是从1开始的,那就必然会造成越界,结果也就不好说了 假设你输入的n是5,你复制是从a[1]到a[5]的,越界了。。 楼主改掉以后再试试

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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