新手,求大神改错,折半查找功能运行没有实现

yangxingwu1991 2012-10-30 11:54:43
/*

题目:
有15个数由从大到小的顺序放在一个数组中,输入一个数,
要求用折半查找法找出该数是数组中的第几个元素的值,
如果没有,则输出"无此数"。

分析:
函数调用
void paixu(int a[],int i)
void zheban(int a[],int n,int y)
int main()
*/
#include<stdio.h>
void paixu(int a[],int i)
{
int k,t,j;
for(k=0;k<14;k++)
for(i=0;i<14-k;i++)
if(a[i]<a[i+1])
{t=a[i];a[i]=a[i+1];a[i+1]=t;}
printf("排序后的数为:\n");
for(j=0;j<15;j++)
printf("%d ",a[j]);
printf("\n");
}

void zheban(int a[],int n,int y)
{
int mid ,high=14,low=0;
mid=(high+low)/2;
while(low<=high)
{
if(a[n]>y)
high=mid-1;
else if(a[n]<y)
low=mid+1;
else
printf("no");
}
printf("你要查找的是第%d个数:",n+1);
}
int main()
{
int j,b[15],z;
printf("input 15 numbers:\n");
for(j=0;j<15;j++)
{
printf("b[%d]=",j);
scanf("%d",&b[j]);
}
printf("\n");
printf("原始的序列为:\n");
for(j=0;j<15;j++)
printf("%d ",b[j]);
printf("\n");
paixu(b,j);
printf("输入一个数:");
scanf("%d",&z);
zheban(b,j,z);
return 0;
}
...全文
118 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ouuyang 2012-10-31
  • 打赏
  • 举报
回复

#include<stdio.h>
void paixu(int a[],int i)
{
int k,t,j;
for(k=0;k<15;k++)
for(i=k;i<15;i++)
if(a[k]<a[i])
{
t=a[i];
a[i]=a[k];
a[k]=t;
}
printf("排序后的数为:\n");
for(j=0;j<15;j++)
printf("%d ",a[j]);
printf("\n");
}

void zheban(int a[],int n,int y)
{
int mid ,high=n,low=0;

while(low<high)
{
mid=(high+low)/2;
if(a[mid]>y)
low=mid+1;
else if(a[mid]<y)
high=mid-1;
else {
printf("你要查找的是第%d个数:",mid);
return;
}
}
printf("你要查找的数不存在");
}

int main(){
int j,b[15],z;
printf("input 15 numbers:\n");
for(j=0;j<15;j++)
{
printf("b[%d]=",j);
scanf("%d",&b[j]);
}
printf("\n");
printf("原始的序列为:\n");

for(j=0;j<15;j++)
printf("%d ",b[j]);
printf("\n");

paixu(b,j);

printf("输入一个数:");
scanf("%d",&z);
zheban(b,j,z);
return 0;
}

羽飞 2012-10-31
  • 打赏
  • 举报
回复
void paixu(int a[],int i)
{
int k,t,j;
for(k=0;k<14;k++)
for(i=0;i<14-k;i++) //这个传入的参数 i就被无情的修改了啊,有木有
if(a[i]<a[i+1])
{t=a[i];a[i]=a[i+1];a[i+1]=t;}
printf("排序后的数为:\n");
for(j=0;j<15;j++)
printf("%d ",a[j]);
printf("\n");
}

void zheban(int a[],int n,int y)
{
int mid ,high=14,low=0;
mid=(high+low)/2;
while(low<=high)
{
if(a[n]>y) //这个n到底是啥意思,我看main函数以为是数组大小,看到这里就疑惑了,请大侠指点
high=mid-1;
else if(a[n]<y)
low=mid+1;
else
printf("no");
}
printf("你要查找的是第%d个数:",n+1);
}
yangxingwu1991 2012-10-31
  • 打赏
  • 举报
回复
经过调试,已经可以运行了。

#include<stdio.h>

void paixu(int a[],int i)
{
int k,t,j;
for(k=0;k<15;k++)
for(i=k;i<15;i++)
if(a[k]<a[i])
{
t=a[i];
a[i]=a[k];
a[k]=t;
}
printf("排序后的数为:\n");
for(j=0;j<15;j++)
printf("%d ",a[j]);
printf("\n");
}


void zheban(int a[],int y)
{
bool flag=false;
int high=14,low=0,m,mid;
for(m=0;m<15;m++)
{
mid=(high+low)/2;
if(a[mid]>y)
low=mid+1;
else if(a[mid]<y)
high=mid-1;
else
flag=true;
}
if(flag==false) printf("无此数\n");
else printf("你要查找的数是第%d个数\n",mid);

}


int main(){
int j,b[15],z;
printf("input 15 numbers:\n");
for(j=0;j<15;j++)
{
printf("b[%d]=",j);
scanf("%d",&b[j]);
}
printf("\n");
printf("原始的序列为:\n");

for(j=0;j<15;j++)
printf("%d ",b[j]);
printf("\n");
paixu(b,j);
printf("输入一个数:");
scanf("%d",&z);
zheban(b,z);
return 0;
}

赵4老师 2012-10-31
  • 打赏
  • 举报
回复

http://www.microsoft.com/visualstudio/en-us/products/2010-editions/visual-cpp-express
右边Visual C++ 2010 Express下面的Select language...下拉选‘简体中文’,再按Install Now按钮


再参考C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\bsearch.c
/***
*bsearch.c - do a binary search
*
* Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
* defines bsearch() - do a binary search an an array
*
*******************************************************************************/

#include <cruntime.h>
#include <stdlib.h>
#include <search.h>
#include <internal.h>

#if defined (_M_CEE)
#define __fileDECL __clrcall
#else /* defined (_M_CEE) */
#define __fileDECL __cdecl
#endif /* defined (_M_CEE) */
/***
*char *bsearch() - do a binary search on an array
*
*Purpose:
* Does a binary search of a sorted array for a key.
*
*Entry:
* const char *key - key to search for
* const char *base - base of sorted array to search
* unsigned int num - number of elements in array
* unsigned int width - number of bytes per element
* int (*compare)() - pointer to function that compares two array
* elements, returning neg when #1 < #2, pos when #1 > #2, and
* 0 when they are equal. Function is passed pointers to two
* array elements.
*
*Exit:
* if key is found:
* returns pointer to occurrence of key in array
* if key is not found:
* returns NULL
*
*Exceptions:
* Input parameters are validated. Refer to the validation section of the function.
*
*******************************************************************************/

#ifdef __USE_CONTEXT
#define __COMPARE(context, p1, p2) (*compare)(context, p1, p2)
#else /* __USE_CONTEXT */
#define __COMPARE(context, p1, p2) (*compare)(p1, p2)
#endif /* __USE_CONTEXT */

#if !defined (_M_CEE)
_CRTIMP
#endif /* !defined (_M_CEE) */

SECURITYSAFECRITICAL_ATTRIBUTE
#ifdef __USE_CONTEXT
void * __fileDECL bsearch_s (
REG4 const void *key,
const void *base,
size_t num,
size_t width,
int (__fileDECL *compare)(void *, const void *, const void *),
void *context
)
#else /* __USE_CONTEXT */
void * __fileDECL bsearch (
REG4 const void *key,
const void *base,
size_t num,
size_t width,
int (__fileDECL *compare)(const void *, const void *)
)
#endif /* __USE_CONTEXT */
{
REG1 char *lo = (char *)base;
REG2 char *hi = (char *)base + (num - 1) * width;
REG3 char *mid;
size_t half;
int result;

/* validation section */
_VALIDATE_RETURN(base != NULL || num == 0, EINVAL, NULL);
_VALIDATE_RETURN(width > 0, EINVAL, NULL);
_VALIDATE_RETURN(compare != NULL, EINVAL, NULL);

/*
We allow a NULL key here because it breaks some older code and because we do not dereference
this ourselves so we can't be sure that it's a problem for the comparison function
*/

while (lo <= hi)
{
if ((half = num / 2) != 0)
{
mid = lo + (num & 1 ? half : (half - 1)) * width;
if (!(result = __COMPARE(context, key, mid)))
return(mid);
else if (result < 0)
{
hi = mid - width;
num = num & 1 ? half : half-1;
}
else
{
lo = mid + width;
num = half;
}
}
else if (num)
return (__COMPARE(context, key, lo) ? NULL : lo);
else
break;
}

return NULL;
}

#undef __fileDECL
#undef __COMPARE

69,373

社区成员

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

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