精华内容
下载资源
问答
  • 近期研习C语言,谭浩强《C语言程序设计(第2版)》P167.6原题: 有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”。因...

    近期研习C语言,谭浩强《C语言程序设计(第2版)》P167.6原题: 有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”。

    因以前使用其他高级语言时从未使用过该查询算法 ,苦思了有差不多半个钟才代码实现。不过对照原版答案后认为自己的算法更简洁。

    原书做法是每一次查找时先根据值的比较结果定出 上界或下界,然后在此范围再提取居中数来做下一步比较。我的实现过程是第一步先取出整个数列居中的数做比较(相当于将取数的“指针”置中),然后根据比较结果将取数“指针”左移或右移,而由于位移量每次比较都会折半,最后当位移量等于0时就无可再移,也就是最后一次进行比较了。

    实现代码如下:

    #include

    void main()

    {

    int i, j, n, k=0, isFound=0;

    int num[15] = {88,86,75,74,61,56,52,43,39,34,31,22,18,16,8}; //测试数组

    printf("请输出一个整数:\n");

    scanf("%d", &n);

    i = (int)15/2; //对折位移量

    j = (int)15/2; //取数“指针”

    while(k<2)

    {

    i = (int)i/2;

    if(i == 0) k++; //i==0 即折半到无可再折时,仍有最后一次比较,故以k做计数

    //若未相等,计算下一循环指针的位置

    if(n

    j = j + (i + 1);

    else if(n>num[j])

    j = j - (i + 1);

    else

    {

    isFound = 1;

    break; //若找到相等数,标记已找到并退出循环

    }

    }

    //输出结果

    if(isFound)

    printf("该数是数组中第%d个元素的值\n", j);

    else

    printf("查无此数!\n");

    }

    注:

    理论上在进入查找之前应该先检查所查的数是否在数组范围内,该步工作没有做;

    关于数组元素个数,除了测试过例题中的15个元素的数组,还加了个元素(16个)也测试通过,即无论元素个数为奇或偶都可以。但未进行更大数量级的测试,若有问题欢迎指正!

    展开全文
  • C语言简单实现折半查找法

    千次阅读 2013-06-09 15:18:07
     有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”。  因以前使用其他高级语言时从未使用过该查询算法 ,苦思了有...

    近期研习C语言,谭浩强《C语言程序设计(第2版)》P167.6原题:
        有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”。
        因以前使用其他高级语言时从未使用过该查询算法 ,苦思了有差不多半个钟才代码实现。不过对照原版答案后认为自己的算法更简洁。
    原书做法是每一次查找时先根据值的比较结果定出 上界或下界,然后在此范围再提取居中数来做下一步比较。我的实现过程是第一步先取出整个数列居中的数做比较(相当于将取数的“指针”置中),然后根据比较结果将取数“指针”左移或右移,而由于位移量每次比较都会折半,最后当位移量等于0时就无可再移,也就是最后一次进行比较了。

    实现代码如下:

    #include <stdio.h>
    
    void main()
    {
    	int i, j, n, k=0, isFound=0;
    	int num[15] = {88,86,75,74,61,56,52,43,39,34,31,22,18,16,8};   //测试数组
    
    	printf("请输出一个整数:\n");
    	scanf("%d", &n);
    
    	i = (int)15/2;    //对折位移量
    	j = (int)15/2;    //取数“指针”
    	while(k<2)
    	{
    		i = (int)i/2;
            if(i == 0) k++;     //i==0 即折半到无可再折时,仍有最后一次比较,故以k做计数
    		
    		//若未相等,计算下一循环指针的位置
    		if(n<num[j])
    			j = j + (i + 1);
    		else if(n>num[j])
    			j = j - (i + 1);
    		else
    		{
    			isFound = 1;
    			break;          //若找到相等数,标记已找到并退出循环
    		}
    	}
    
    	//输出结果
    	if(isFound)
    		printf("该数是数组中第%d个元素的值\n", j);
    	else
    		printf("查无此数!\n");
    }


    注:

    1. 理论上在进入查找之前应该先检查所查的数是否在数组范围内,该步工作没有做;
    2. 关于数组元素个数,除了测试过例题中的15个元素的数组,还加了个元素(16个)也测试通过,即无论元素个数为奇或偶都可以。但未进行更大数量级的测试,若有问题欢迎指正!
    展开全文
  • 有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数组中第几个元素的值。如果该数不在数组中,则输入无此数。
  • 用c语言编写折半查找法

    千次阅读 2017-04-09 17:18:41
    折半查找法又称为二分查找,是在一个有序数组里面找到一个具体的数,方法我在代码里注释到了。 #include int binary_search(int *arr, int key, int sz)//创建一个函数 { int left = 0;//定义数组中元素的左下标...

    折半查找法又称为二分查找,是在一个有序数组里面找到一个具体的数,方法我在代码里注释到了。

    #include<stdio.h>
    
    
    int binary_search(int *arr, int key, int sz)//创建一个函数
    {
    	int left = 0;//定义数组中元素的左下标
    	int right = sz - 1;//定义数组中元素的右下标
    	int mid = 0;//定义数组中一个元素的下标
    	while (left <= right)//判断左下标是否小于等于右下标,如果等于进入循环
    	{
    		mid = left + ((right - left) >> 1);//中间元素的下标计算
    		if (arr[mid] == key)
    		{
    			return mid;//如果中间元素等于目标元素,则返回中间元素的下标
    		}
    		else if (arr[mid] > key)
    		{
    			right = mid - 1;//如果中间元素大于目标元素,右下标变为中间元素的下标减去一
    		}
    		else
    		{
    			left = mid + 1;//如果小于,则左下标变为中间元素的下标加上一
    		}
    	}
    		return 1;//如果不等于,返回值为1
    }
    int main()
    {
    	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };//创建一个有序的数组arr
    	int key = 8;//定义你要找到的目标元素
    	int sz = sizeof(arr) / sizeof(arr[0]);//求这个数组的长度
    	int ret = binary_search(arr, key, sz);
    	if (ret == 1)//如果返回值为1
    	{
    		printf("找不到\n");//则输出结果为找不到
    	}
    	else
    	{
    		printf("%d\n", ret);//不然,则输出目标元素的下标
    	}
    
    	return 0;
    }
    下面为输出的结果



    展开全文
  • C语言基础:折半查找

    2020-03-23 21:54:23
    输入一组(10个数)从小到大有序且不重复的整数,用折半查找法在其中查找x,若x存在,输 出该数在数组中的下标,若找不到x,显示“no” 输入包括两行数据: 第一行:包括10个int类型整数,空格间隔,系统保证其...

    输入一组(10个数)从小到大有序且不重复的整数,用折半查找法在其中查找x,若x存在,输 出该数在数组中的下标,若找不到x,显示“no”
    输入包括两行数据: 第一行:包括10个int类型整数,用空格间隔,系统保证其从小到大有序且不重复(即你不需要判断该组数据是否有序且不重复); 第二行:输入待查找的int型整数x
    输入样例:
    1 2 3 4 5 6 7 8 9 10
    5

    输出样例:
    4

    #include<stdio.h>
    int main(){
    	int a[10],i,left=0,mid,x,right,flag;//mid为标值
    	for(i=0;i<10;i++)
    		scanf("%d",&a[i]);
    	left=0;right=9;flag=0;//将数据左右定义为下标
    	scanf("%d",&x);
    	if(x>=a[left]&&x<=a[right])//判断输入数据是否在a内
    	{	while(!flag&&left<=right)//循环不断折半靠近x,flag==0时为未找到
    		{	mid=(left+right)/2;//mid为数组的中点
    			if(a[mid]==x)flag=1;//找到
    			else if(x>a[mid])left=mid+1;//x位于中点的右边
    			else right=mid-1;//位于左边
    		}
    	}
    	if(flag==1)printf("%d",mid);
    	else printf("no");
    	return 0;
    }
    
    展开全文
  • 找数字,折半查找法或二分查找法) 注意:基于 有序数组int main() { int arr[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int key = 1; int left = 0; int right = sizeof(arr)/sizeof(arr[0])-1;//下标 while ...
  • C语言:有N个数从小到大的顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个数。如果不在数组中,打印“not found”。
  • 20),已按从大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中的第几个元素的值。如果不在数组中输出0。要求: 编写两个函数input和binbearch分别实现数组数据的输入和元素的查找。Input第...
  • Problem A: C语言习题 折半查找Time Limit: 1 Sec Memory Limit: 128 ...20),已按从大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中的第几个元素的值。如果不在数组中输出0。要...
  • C语言折半查找

    2019-04-18 09:39:49
    有10个整数已按从小到大的顺序排好序,存储在一个数组中,再输入一个数,要求用折半查找法找出该数是数组中的第几个元素(输出该元素的下标即可)。如果该数不在数组中,则输出"Not exist!" 输入 输入数据共2行 ...
  • YTU 2413 C语言习题折半查找

    千次阅读 2019-04-08 12:12:41
    =1000000),这n个数已按从大到小顺序存放在一个数组中,然后有T次查询,每次输入一个数,要求用折半查找法找出该数在数组中第一次出现的位置。如果不在数组中输出0。 输入 第一行数组元素的个数n 第二行n个数组...
  • 有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数” 2 解法 //C程序设计第五版(谭浩强) //章节:第六章 利用数组处理...
  • oj2413:C语言习题 折半查找

    千次阅读 2017-04-26 16:50:49
    问题描述:有n个数(n 要求: 编写两个函数input和binbearch分别实现数组数据的输入和元素的查找。...问题描述:有n个数(n),已按从大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是
  • 6习题9 有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出无此数 代码 #include &lt;stdio.h&gt; int main() { int a[15...
  • //写一个函数,findByName,用折半法按姓名查找指定的职工,找到返回数组下标,找不到返回-1 int zhe(char name[][121],double money[],char m[]) { int top,bottom,mid; top=0; bottom=M-1; mid=(top+bottom)/2;...
  • 从键盘输入一个字符,用折半查找法找出该字符在已排序的字符串str中的位置。若该字符不在str中,则打印输出**。 二、分析解答 此题主要考察字符串的应用,由于C语言并没有字符串类型,因此,需要使用字符数组来...
  • 折半查找法

    2015-06-28 16:44:53
    有15个按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”。 【C语言】 #include int main() { int a[15] = { 15, 14, 13, ...
  • 查找算法 有15个数按从小到大的顺序存放在一个数组中输入一个数要求用折半查找法找出该数是数组中第几个元素的值如果该数不在数组中输出不在表中 * 解 从表列中查一个数最简单的方法是从第1个数开始顺序查找将要找的...
  • 有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”。以下是此题的【c源代码】,需要【c++源代码】请点击进入#include #...
  • 通过C语言来实现数组元素的查找 查找数组元素,如果找到了,就输出它的下标,找不到的话就输出“找不到这个数” 遍历法 将所要查找的数与数组中从第一个元素开始进行比较,若遍历完数组所有元素都没有与要找的的...
  • =1000000),这n个数已按从大到小顺序存放在一个数组中,然后有T次查询,每次输入一个数,要求用折半查找法找出该数在数组中第一次出现的位置。如果不在数组中输出0。 输入 第一行数组元素的个数n 第二...
  • 排序容量可自定义,对数组分别冒泡和选择排序。然后用折半查找对输入的数查找,看在数组中是否出现。
  • ③要求输入一个职工号,这儿版查找发找出该职工的姓名,从主函数输入要查找的职工号,输出该职工。 可以定义一个二维数组来存放职工的姓名,同时定义一个整型数组存放职工号。 在对姓名数组进行调整的时候,按照...
  • (3) 要求任意输入一个整数,用折半查找法从排好序的10个数中找出该数,若存在,在主函数中输出其所处的位置,否则,提示未找到。提示:可定义input函数完成10个整数的输入,sort函数完成输入数的排序,search函数...
  • c语言二分查找

    2019-01-02 13:33:29
     折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下O(log n)完成搜索任务。它的基本思想是:(这里假设数组元素呈升序排列)将n个元素分成个数大致相同的两半,取a[n/2...
  • 题目:从键盘输入一个整数,,用折半查找法找出该数在 10 个有 序整型数组 a 中的位置。若该数不在 a 中,则打印出相应信息。 试编程。 分析:问题的突破点在于循环在什么时候终止,带入几个特定的值可以发现,要不...
  • 二分查找C语言实现

    2014-08-10 10:47:00
    先预设值一段数组,再输入一个数,二分查找法找到这个数再数组中的位置,并输出位置,通常使用二分法查找。 下面是示例代码,查找二十个数中的某数并输出位置。 #include <stdio.h> #include <stdlib...
  • //写一个函数,findByName,用折半法按姓名查找指定的职工,找到返回数组下标,找不到返回-1 int zhe(char name[][121],double money[],char m[]) { int top,bottom,mid; top=0; bottom=M-1; mid=(top+bottom)/2;...

空空如也

空空如也

1 2 3
收藏数 55
精华内容 22
关键字:

c语言用数组折半查找法

c语言 订阅