两个自定义函数的原型分别为:
void sort(int a[], int n);
int find(int a[], int n, int x);
但是我只会写排序的代码:
#include<stdio.h>
void sort(int a[],int n)
{
int i,j;
for(i=1;i<n;i++)
{
for(j=0;j<n-i;j++)
{
if(a[j]<a[j+1])
{
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}
int main()
{
int a[10]={11,12,13,14,15,16,17,18,19,20};
sort(a,10);
int i;
for(i=0;i<10;i++)
{
printf("%d\n",a[i]);
}
return 0;
}
请求哪位大神帮我在我写的代码中加入 函数实现对10个排好序的元素进行折半法查找,如果找到了返回对应的元素下标值,否则返回0。
这张图是我在教材上找到的折半法,但是不知道怎么写进这个程序,求大神帮我就按这种写进去:
4 个解决方案
#1
折半查找可参考
VC\crt\src\bsearch.c
VC\crt\src\bsearch.c
#2
你要在你的子函数里,排序后,再加一个循环,就是把你看的书上的代码加进去。
你的排序是实现的从大到小的排序,要改成从小到大的排序。
下面星号之间的,就是书上的代码。子函数参数要加一个要查找的关键字,要有返回下标的值。
你的排序是实现的从大到小的排序,要改成从小到大的排序。
下面星号之间的,就是书上的代码。子函数参数要加一个要查找的关键字,要有返回下标的值。
#include<stdio.h>
void print_s(int *p,int n);
int sort(int a[],int n,int key)
{
int i,j;
for(i=1;i<n;i++)
{
for(j=0;j<n-i;j++)
{
if(a[j]>a[j+1])
{
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
print_s(a,10);
/*折半查找***************************/
int low,high,mid;
low = 0;
high = n-1;
while (low <= high)
{
mid = (low+high)/2;
if (a[mid]<key)
low = mid+1;
else if(a[mid]>key)
high = mid-1;
else
return mid;
}
return -1;
/*****************************/
}
int main()
{
int ret;
int a[10]={11,12,13,14,15,16,17,18,19,20};
print_s(a,10);
ret = sort(a,10,17);
if (ret==-1)
printf("没找到\n");
else
printf("下标是:%d\n",ret);
// int i;
// for(i=0;i<10;i++)
// {
// printf("%d\n",a[i]);
// }
return 0;
}
void print_s(int *p,int n)
{
int i;
for (i = 0;i<n;i++)
{
printf("%d ",*(p+i));
}
printf("\n");
}
#3
折半查找本来就是要在一个排序好的序列里找。为什么你要改成从大到小排序。初学的话,从小到大更好理解些。
#4
你一定要从大到小找,就用这个。
#include<stdio.h>
void print_s(int *p,int n);
int sort(int a[],int n)
{
int i,j;
for(i=1;i<n;i++)
{
for(j=0;j<n-i;j++)
{
if(a[j]<a[j+1])
{
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}
/*折半查找***************************/
int find(int a[], int n, int x)
{
int low,high,mid;
low = 0;
high = n-1;
while (low <= high)
{
mid = (low+high)/2;
if (a[mid]>x)
low = mid+1;
else if(a[mid]<x)
high = mid-1;
else
return mid;
}
return -1;
/*****************************/
}
int main()
{
int ret;
int a[10]={11,12,13,14,15,16,17,18,19,20};
print_s(a,10);
sort(a,10);
print_s(a,10);
ret = find(a,10,17);
if (ret==-1)
printf("没找到\n");
else
printf("下标是:%d\n",ret);
// int i;
// for(i=0;i<10;i++)
// {
// printf("%d\n",a[i]);
// }
return 0;
}
void print_s(int *p,int n)
{
int i;
for (i = 0;i<n;i++)
{
printf("%d ",*(p+i));
}
printf("\n");
}
#1
折半查找可参考
VC\crt\src\bsearch.c
VC\crt\src\bsearch.c
#2
你要在你的子函数里,排序后,再加一个循环,就是把你看的书上的代码加进去。
你的排序是实现的从大到小的排序,要改成从小到大的排序。
下面星号之间的,就是书上的代码。子函数参数要加一个要查找的关键字,要有返回下标的值。
你的排序是实现的从大到小的排序,要改成从小到大的排序。
下面星号之间的,就是书上的代码。子函数参数要加一个要查找的关键字,要有返回下标的值。
#include<stdio.h>
void print_s(int *p,int n);
int sort(int a[],int n,int key)
{
int i,j;
for(i=1;i<n;i++)
{
for(j=0;j<n-i;j++)
{
if(a[j]>a[j+1])
{
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
print_s(a,10);
/*折半查找***************************/
int low,high,mid;
low = 0;
high = n-1;
while (low <= high)
{
mid = (low+high)/2;
if (a[mid]<key)
low = mid+1;
else if(a[mid]>key)
high = mid-1;
else
return mid;
}
return -1;
/*****************************/
}
int main()
{
int ret;
int a[10]={11,12,13,14,15,16,17,18,19,20};
print_s(a,10);
ret = sort(a,10,17);
if (ret==-1)
printf("没找到\n");
else
printf("下标是:%d\n",ret);
// int i;
// for(i=0;i<10;i++)
// {
// printf("%d\n",a[i]);
// }
return 0;
}
void print_s(int *p,int n)
{
int i;
for (i = 0;i<n;i++)
{
printf("%d ",*(p+i));
}
printf("\n");
}
#3
折半查找本来就是要在一个排序好的序列里找。为什么你要改成从大到小排序。初学的话,从小到大更好理解些。
#4
你一定要从大到小找,就用这个。
#include<stdio.h>
void print_s(int *p,int n);
int sort(int a[],int n)
{
int i,j;
for(i=1;i<n;i++)
{
for(j=0;j<n-i;j++)
{
if(a[j]<a[j+1])
{
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}
/*折半查找***************************/
int find(int a[], int n, int x)
{
int low,high,mid;
low = 0;
high = n-1;
while (low <= high)
{
mid = (low+high)/2;
if (a[mid]>x)
low = mid+1;
else if(a[mid]<x)
high = mid-1;
else
return mid;
}
return -1;
/*****************************/
}
int main()
{
int ret;
int a[10]={11,12,13,14,15,16,17,18,19,20};
print_s(a,10);
sort(a,10);
print_s(a,10);
ret = find(a,10,17);
if (ret==-1)
printf("没找到\n");
else
printf("下标是:%d\n",ret);
// int i;
// for(i=0;i<10;i++)
// {
// printf("%d\n",a[i]);
// }
return 0;
}
void print_s(int *p,int n)
{
int i;
for (i = 0;i<n;i++)
{
printf("%d ",*(p+i));
}
printf("\n");
}