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

时间:2021-05-05 11:40:51
题目是:写两个自定义函数,第一个函数实现对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。


这张图是我在教材上找到的折半法,但是不知道怎么写进这个程序,求大神帮我就按这种写进去:
函数实现对10个排好序的元素进行折半法查找

4 个解决方案

#1


折半查找可参考
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

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