谢谢cacker提供的函数!
修改后如下:
第一种
#include <stdio.h>
int main(int argc, char *argv[])
{
int HalfSearch(int array[], int nLength, int value);
int i,j,t,n,x,w,a[100000];
printf("请输入n的值:\n");
scanf("%d",&n);
printf("请输入n个正整数:\n");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
printf("先对数组a进行排序:\n");
for(j=0;j<n-1;j++)
for(i=0;i<n-1-j;i++)
if(a[i]>a[i+1])
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
printf("%d个数由小到大排序为:\n",n);
for(i=0;i<n;i++)
printf("%d,",a[i]);
printf("\n");
printf("请输入要查找的数字:\n");
scanf("%d",&x);
w=HalfSearch(a, n, x);
if(w>=0)
{
printf("%d的位置是第%d个。",x,w);
}
else
{
printf("错误!");
}
return 0;
}
//功能: 折半查找法
注:必须先排序 并且是升序
//参数: arrary 目的数组, nLength数组长度, value 要查找的数据
//返回: 如果有这个数组,就返回在数组里的位置,如果没有返回-1
int HalfSearch(int array[], int nLength, int value)
{
int nIndex =-1;
int mid = 0;
//中间位置
int left = 0;
int right = nLength - 1;
while(left <= right)
{
mid = (left + right)/2 ;
if ( value == array[mid])
{
nIndex = mid+1 ;
break ;
}
else if (value < array[mid])
right = mid - 1;
else
left = mid + 1;
}
return nIndex;
}
第二种
#include <stdio.h>
int main(int argc, char *argv[])
{
int HalfSearch(int array[], int nLength, int value);
int i,j,t,n,x,w,a[100000];
printf("请输入n的值:\n");
scanf("%d",&n);
printf("请输入n个正整数:\n");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
printf("先对数组a进行排序:\n");
for(j=0;j<n-1;j++)
for(i=0;i<n-1-j;i++)
if(a[i]>a[i+1])
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
printf("%d个数由小到大排序为:\n",n);
for(i=0;i<n;i++)
printf("%d,",a[i]);
printf("\n");
printf("请输入要查找的数字:\n");
scanf("%d",&x);
int l=0,r=n-1;
while(l<=r)
{
i=(l+r)/2;
if(x==a[i])
{
w=i+1;
break;
}
else
if(x<a[i])
{
r=i-1;
}
else
l=i+1;
}
if(w>=0)
{
printf("%d的位置是第%d个。",x,w);
}
else
{
printf("错误!");
}
return 0;