c语言折半查找法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言折半查找法相关的知识,希望对你有一定的参考价值。

将15个数按从大到小存放在一个数组中,输入一个数要求用折半法找出该数组中第几个元素的值...我是在不知道错在哪里...执行的时候输入了x后计算机就开始混乱了...请赐教,谢谢!!!

#include<stdio.h>
int main()

int a[15],x,y,i;
printf("input 15 numbers:\n");
for(i=0;i<15;i++)scanf("%d",&a[i]);
printf("please enter the number:\n");
scanf("%d",&x);
for(i=7;i<=14&&i>=0;)
if (x=a[i])
y=i+1;
printf("%d",y);
else
if (x>a[i])
i=i/2+1 ;
else i=i+(14-i)/2;
;

折半查找法是算法一种,可以被任何计算机语言使用。用C语言自然也可以实现。

1、定义:

在计算机科学中,折半搜索(英语:half-interval search),也称二分搜索(英语:binary search)、对数搜索(英语:logarithmic search),是一种在有序数组中查找某一特定元素的搜索算法。

搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。

2、查找规则:

折半查找法是效率较高的一种查找方法。假设有已经按照从小到大的顺序排列好的五个整数a0~a4,要查找的数是X,其基本思想是: 设查找数据的范围下限为l=0,上限为h=4,求中点m=(l+h)/2,用X与中点元素am比较,若X等于am,即找到,停止查找;否则,若X大于am,替换下限l=m+1,到下半段继续查找;若X小于am,换上限h=m-1,到上半段继续查找;如此重复前面的过程直到找到或者l>h为止。如果l>h,说明没有此数,打印找不到信息,程序结束。

3、C语言参考代码:

int bin_search(int A[],int n,int key)
//在长度为n的数组A 中折半查找值为key的元素,并返回下标值。如果不存在则返回-1.
    int low,high,mid;
    low = 0;
    high = n-1;//初始low和high为数组的两端。
    while(low<=high)
    
        mid =(low + high)/2;//查找中心点。
        if(A[mid]==key)return mid;//已找到,返回下标值。
        if(A[mid]<key)//中点位置比key值小,以mid+1为新的下限值。
            low =mid + 1;
        
        if(A[mid]>key)//中点位置比key值大,以mid-1为新的上限值。
            high= mid - 1;
        
    
    return -1;//未找到,返回-1.
参考技术A if (x=a[i]) /* 应该是x==a[i]吧 */

用递归实现,程序会很好理解
int f(int a[],int x, int start,int end)

int i=start+(end-start)/2;
if(start>end) return -1;/* 没找到,返回-1 */
if(a[i]==x) return i;
else if(a[i]>x) return f(a,x,i+1,end);
else return f(a,x,start,i-1);

--------------------------------------------------------------------------
修改如下:
#include<stdio.h>
void main()

int a[15],x,i,start,end;
printf("input 15 numbers:\n");
for(i=0;i<15;i++) scanf("%d",&a[i]);
printf("please enter the number:\n");
scanf("%d",&x);
for(start=0,end=14;start<=end;)

i=start+(end-start)/2;
if (x==a[i])

printf("%d",i+1);
getch();
return;

else if (x>a[i]) end = i-1;
else start=i+1;

本回答被提问者采纳
参考技术B 你的算法有问题的,只有15个数你就模拟下计算机算下就知道。
另外找到x的时候你也没有break退出循环。
参考技术C 首先,应当声明两个变量来记录这般查找空间的范围,这里我们定义begin和end;其次判断语句if(x=a[i])中x=a[i]是赋值语句,"=="是判断相等运算符,应该为if(x == a[i]);最后,主函数为int型,应最后返回0表示运行成功,即在程序结尾家return 0;

以下是我在你代码基础上略加修改,已通过运行并成功。
#include<stdio.h>
int main()

int a[15],x,y,i;
printf("input 15 numbers:\n");
for(i=0;i<15;i++)
scanf("%d",&a[i]);
printf("please enter the number:\n");
scanf("%d",&x);
int begin = 0, end = 14;
while(begin <= end)

i = (begin + end) / 2;
if (x==a[i])

y=i+1;
printf("%d",y);
break;

else
if (x>a[i])
end = i - 1;
else
begin = i + 1;

return 0;
参考技术D #include<stdio.h>
#include<stdlib.h>

int cmp(const void * a,const void * b)
return *((int *)a)-*((int *)b);


void main()

int a[15],x,i,start,end;
printf("input 15 numbers:\n");
for(i=0;i<15;i++)
scanf("%d",&a[i]);
qsort(a,15,sizeof(int),cmp);
printf("please enter the number:\n");
scanf("%d",&x);

for(start=0,end=14;start<=end;)

i=(start+end)>>1;
if (x==a[i])

printf("%d",i+1);
getchar();
getchar();
return;

else if (x>a[i])
start = i+1;
else
end=i-1;

算法篇——二分查找法(折半查找法)

        二分查找法(折半查找法):查找数组中是否包含指定元素。如果包含指定元素,则返回指定元素的index(从0开始);如果不包含指定元素,则返回-1;

        前提:数组中的元素必须是有序的。

        原理:将被查找的数组分为三部分,依次是中值前、中值、中值后,将指定元素和数组的中值进行比较,如果指定元素小于中值则在(中值前)中找,如果指定元素大于中值则在(中值后)中找,如果指定元素等于中值则直接返回。依次查找后,如果不包含指定元素,则返回-1;

                  注:中值即数组中间位置的值。

        原生方法:Arrays.sort(a);:对a数组进行升序排序。

                         Arrays.binarySearch(a,b);:使用二分法查找a数组中是否包含b这个元素。

        两种方式:循环实现和递归实现

/** * 循环实现 * 二分查找法(折半查找法):查找数组中是否包含指定元素。 * 前提:数组中的元素必须是有序的。 * Arrays.sort(a);:对a数组进行升序排序。 * Arrays.binarySearch(a,b);:使用二分法查找a数组中是否包含b这个元素。 * * @param arr 被查找的数组 * @param key 指定元素 * @return 如果包含指定元素,则返回指定元素的index(从0开始);如果不包含指定元素,则返回-1; */public static int binarySearch(int[] arr, int key) { int min = 0; int max = arr.length - 1;
while (min <= max) { int mid = (min + max) >> 1;//(min + max)/2
if (arr[mid] > key) { max = mid - 1; } else if (arr[mid] < key) { min = mid + 1; } else { return mid; } }
return -1;}
/** * 递归实现 * 二分查找法(折半查找法):查找数组中是否包含指定元素。 * 前提:数组中的元素必须是有序的。 * Arrays.sort(a);:对a数组进行升序排序。 * Arrays.binarySearch(a,b);:使用二分法查找a数组中是否包含b这个元素。 * * @param arr 被查找的数组 * @param key 指定元素 * @return 如果包含指定元素,则返回指定元素的index(从0开始);如果不包含指定元素,则返回-1; */public static int binarySearch(int[] arr, int key, int startIndex, int endIndex) { if (startIndex > endIndex || startIndex < 0 || endIndex > arr.length - 1) { return -1; }
int midIndex = (startIndex + endIndex) >> 1;//(startIndex + endIndex)/2
if (arr[midIndex] > key) { return binarySearch(arr, key, startIndex, midIndex - 1); } else if (arr[midIndex] < key) { return binarySearch(arr, key, midIndex + 1, endIndex); } else { return midIndex; }}

        

验证:

//验证自定义的二分查找法int[] a = {};int[] b = {1, 2, 3, 4, 5, 6, 7, 8, 9};int[] c = {1, 4, 6, 7, 8, 3, -2};//循环实现int circulate1 = binarySearch(a, 0);int circulate2 = binarySearch(b, 5);int circulate3 = binarySearch(c, -2);Arrays.sort(c);int circulate4 = binarySearch(c, -2);LogUtil.e("++++++++++++++++", circulate1 + ""); //-1LogUtil.e("++++++++++++++++", circulate2 + ""); //4LogUtil.e("++++++++++++++++", circulate3 + ""); //-1LogUtil.e("++++++++++++++++", circulate4 + ""); //0//递归实现int recursion1 = binarySearch(a, 0, 0, a.length - 1);int recursion2 = binarySearch(b, 5, 0, b.length - 1);int recursion3 = binarySearch(c, -2, 0, c.length - 1);LogUtil.e("++++++++++++++++", recursion1 + ""); //-1LogUtil.e("++++++++++++++++", recursion2 + ""); //4LogUtil.e("++++++++++++++++", recursion3 + ""); //0

以上是关于c语言折半查找法的主要内容,如果未能解决你的问题,请参考以下文章

C语言折半查找法详细代码(假如有10个已排好序的数)

c语言编程实现“折半查找”的过程。

折半查找(C语言)

折半查找(C语言)

用递归法写一个折半查找的算法

C语言二分查找算法,折半查找算法