二分查找,qsort排序

qepjatdwj 2009-03-23 12:41:14
从给定n个数中查找指定的数m, 输出它是第几大的数(不用考虑重复的)考虑到程序运行速度,排序应该用qsort,查找用二分查找

#include<stdio.h>
#include<stdlib.h>
int compare(const void *, const void *);
int BinarySearch(int a[], const int &x,int n);
void main()
{
int a[10000],i,n,m,middle;
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
qsort(a, n, sizeof(int), compare); //降序排
if((middle=BinarySearch(a,m,n))!=-1) printf("%d",middle+1); //二分查找
else printf("not found");
}

int BinarySearch(int a[], const int &x,int n)
{
int left=0;
int right=n-1;
while(left<=right){
int middle=(left+right)/2;
if(x==a[middle]) return middle;
if(x<a[middle]) left=middle+1;
else right=middle-1;
}
return -1;
}
int compare(const void *p, const void *q)
{
return (*(int *)q - *(int *)p);
}
VC和gcc都通过编译,且结果正确,可是到系统里一测试却AC不了:
Compile Error
18700\Main.c:4: error: syntax error before '&' token
18700\Main.c:16: error: syntax error before '&' token
18700\Main.c: In function `BinarySearch':
18700\Main.c:19: error: `n' undeclared (first use in this function)
18700\Main.c:19: error: (Each undeclared identifier is reported only once
18700\Main.c:19: error: for each function it appears in.)
18700\Main.c:22: error: `x' undeclared (first use in this function)
18700\Main.c:22: error: `a' undeclared (first use in this function)
实在想不出错哪了,谁给我看看?
...全文
96 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
tongweline 2009-03-23
  • 打赏
  • 举报
回复
我运行也没出错。程序没有问题。
qepjatdwj 2009-03-23
  • 打赏
  • 举报
回复
楼上两位是对的。
引用是C++的语法。已经AC了。
kingstarer 2009-03-23
  • 打赏
  • 举报
回复
引用是C++的语法 要用指针
lbh2001 2009-03-23
  • 打赏
  • 举报
回复
不是使用引用,使用指针看看
#include <stdio.h> 
#include <stdlib.h>

int compare(const void *, const void *);
int BinarySearch(int a[], const int *x,int n);

int main(void)
{
int a[10000], i, n, m, middle;
scanf("%d%d", &n, &m);
for (i = 0; i < n; i++)
scanf("%d", &a[i]);

qsort(a, n, sizeof(int), compare); //降序排

if ((middle = BinarySearch(a, &m, n)) != -1)
printf("%d", middle+1); //二分查找
else
printf("not found");

return 0;
}

int BinarySearch(int a[], const int *x, int n)
{
int left = 0;
int right = n - 1;
while (left <= right)
{
int middle = (left + right) / 2;
if (*x == a[middle])
return middle;
if (*x < a[middle])
left = middle + 1;
else
right = middle - 1;
}
return -1;
}

int compare(const void *p, const void *q)
{
return (*(int *)q - *(int *)p);
}

f22fbi 2009-03-23
  • 打赏
  • 举报
回复
系统的编译器有问题吧?
  • 打赏
  • 举报
回复
我这里编译通过了啊
rivulettornado 2009-03-23
  • 打赏
  • 举报
回复
确实是可以运行,怀疑可能是编译器设置问题?或者是在编辑器中,出现了隐藏的字符了?

69,373

社区成员

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

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