请高手看看下面这个C++二分查找程序有错在什么地方

来源:百度知道 编辑:UC知道 时间:2024/05/02 22:27:35
#include<iostream.h>
#include<stdlib.h>
fun(int *a,int s,int k)//二分查找
{
int mid,low,high;
low=0;high=s-1;
while(low<=high)
{
mid=(low+high)/2;
if(a[mid]==k)
return mid;
else if(k>a[mid])
low=mid+1;
else if(k<a[mid])
high=mid-1;
}
return -1;
}
paixu(int *a,int s)//冒泡排序
{
int m,n,t;
for(m=1;m<s;m++)
{for(n=s-m;n>0;n--)
if(a[n]>a[n+1])
{t=a[n];a[n]=a[n+1];a[n+1]=t;}
}
}
void main()
{
int *a,s,n,k,i;
cout<<"请输数字的总个数:";
cin>>s;
a=(int *)malloc(s*sizeof(int));
cout<<endl<<"请输入要查找的目标数:";
cin>>k;
cout<<endl<<"请输入待查找的"<<s<<"个数:";
for(i=0;i<s;i++)
cin>>*(a+i);
paixu(a,s); //冒泡排序
n=fu

1.fun()函数里的return mid应该是return mid+1;
因为low从0开始,mid是a[]数组的下标,下标为0的代表是数组的第一个数, 那下表为mid的数应该是mid+1
2.冒泡排序的算法有问题:首先是for(m=1;m<s;m++)应为for(m=0;m<s;m++),外层循环要从第一个数就是下表为0的数开始;其次是 for(n=s-m;n>0;n--) 应为for(n=s-m-1;n>0;n--),这也是下标比实际位次少1的道理;再次是两数交换的代码if(a[n]>a[n+1])
{t=a[n];a[n]=a[n+1];a[n+1]=t;}
应为if(a[n-1]>a[n])
{t=a[n-1];a[n-1]=a[n];a[n]=t;}
这仍然是上面的道理。
从上面的原因看来,阁下在此程序上的主要问题是对数组下标表示的运用尚未完全成熟,多做此方面的练习可行。
附带说下,作为一名有志于从事程序设计的学习者,在编辑代码的时候,我们要考虑到用户的输入习惯,像上面的数的输入,应该是先让用户输入在哪几个数中查找,然后再让用户输入要查找的特定的数。因为,一个程序,从本质上来说也是一件商品。

#include<iostream.h>
#include<stdlib.h>
fun(int *a,int s,int k)//二分查找
{
int mid,low,high;
low=0;high=s-1;
while(low<=high)
{
mid=(low+high)/2;
if(a[mid]==k)
return mid;
else if(k>a[mid])
low=mid+1;
else if(k<a[mid])
high=mid-1;
}
return -1;
}
paixu(int *a,int s