函数实现对10个排好序的元素进行折半法查找

baidu_33185996 2015-12-01 02:46:40
题目是:写两个自定义函数,第一个函数实现对10个元素进行从大到小的排序;第二个函数实现对10个排好序的元素进行折半法查找,如果找到了返回对应的元素下标值,否则返回0。编写相应的主函数测试。
两个自定义函数的原型分别为:
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。


这张图是我在教材上找到的折半法,但是不知道怎么写进这个程序,求大神帮我就按这种写进去:
...全文
256 点赞 收藏 4
写回复
4 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
visp 2015-12-01
你一定要从大到小找,就用这个。

#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");
}

回复
visp 2015-12-01
折半查找本来就是要在一个排序好的序列里找。为什么你要改成从大到小排序。初学的话,从小到大更好理解些。
回复
visp 2015-12-01
你要在你的子函数里,排序后,再加一个循环,就是把你看的书上的代码加进去。 你的排序是实现的从大到小的排序,要改成从小到大的排序。 下面星号之间的,就是书上的代码。子函数参数要加一个要查找的关键字,要有返回下标的值。

#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");
}

回复
赵4老师 2015-12-01
折半查找可参考 VC\crt\src\bsearch.c
回复
相关推荐
发帖
C语言
创建于2007-09-28

6.4w+

社区成员

C语言相关问题讨论
申请成为版主
帖子事件
创建了帖子
2015-12-01 02:46
社区公告
暂无公告