- 浏览: 38213 次
- 性别:
- 来自: 北京
文章分类
最新评论
为了提高查找效率,在一个数组中查找某个数据是否存在时,可以先将数组数据排序,将排序后的数列的中点设置为比较的对象,如果要找的元素的值小于该中点元素,则将待查序列缩小为左半部分,否则为右半部分。即根据比较的结果排除掉数组一半的元素,再在余下的一半数组元素中取中间的一个元素进行比较,并根据比较的结果再次排除一半的数组元素,以此类推,直至最终找到为止。这就是二分查找(Binary Search),由于二分查找法每次都根据比较结果排除一半的数据,因此也称为“折半查找法”。二分查找的先决条件是:查找表中的数据元素必须有序。在二分法中,只能对递增的数组进行查找。
算法步骤:
1、首先是确定整个查找区间的中间位置,mid = ( left + right )/2;
2、用待查数据的值与中间位置的数据值进行比较:若相等,则查找成功;若大于,则在后半区域继续进行二分查找;若小于,则在前半区域继续进行二分查找。(这步是循环的过程)
3、用二分查找法对确定后的区域再次进行范围缩小的查找,直到查找到结果为止。
下面举个例子:用随机函数rand产生一个100内的10个元素的数组,用键盘输入一个数字,用二分法查找。若找到打印出位置,若没有,则输入无次数。
#include <stdio.h> #include <stdlib.h> void main() { int a[10],i,j,temp,min,t,site; for(i=0;i<10;i++) { a[i]=rand()%101;//用随机函数产生一个--100的包含个元素的无序数组 /*printf("%d ",a[i]);*/ } printf("随机产生的数组为:"); for(i=0;i<10;i++) printf("%d ",a[i]); //以上为随机产生数组过程 printf("\n");//换行 for(i=0;i<10;i++) { min=a[i]; t=i; for(j=i+1;j<10;j++) { if(a[j]<min) { min=a[j]; t=j; } } temp=a[i]; a[i]=a[t]; a[t]=temp; /*printf("%d ",a[i]);*/ //在这里输出排序后的数组也可以。 } printf("排序后的数组为:"); for(i=0;i<10;i++) printf("%d ",a[i]); //以上为排序过程 printf("\n"); //换行 printf("请输入要查找的数字:"); int find; scanf("%d",&find); int low = 0;//定义数组低位下标并赋初值 int high = 9;//定义数组高位下标并赋初值 int mid;//定义数组中间下标 site = -1; while(low<=high) { mid=(low+high)/2; if(find==a[mid]) { site=mid;//将找到的下标值赋给site,site主要用来记录所找数的位置 break; } else { if(find<a[mid]) high=mid-1;//将高位往左移,确定查找的终点。用high=mid也可以,只是多计算一次。 else low=mid+1;//将低位往右移,确定查找的起点。用low=mid也可以,只是多计算一次。 } } if(site != -1) printf("找到了你所需要查找的数字%d,是第%d个数\n",find,site+1); else printf("没有找到你输入的数字。"); //以上为二分法查找过程 }
发表评论
-
String中的小问题2
2010-10-25 14:24 68//题目;收集顾客反馈意见信息(用户输入的自己姓名、联系方 ... -
斐波那契数列
2010-10-25 14:23 160/**题目:斐波那契数列 * 求fibonacci数列 ... -
String中的小问题
2010-10-25 14:22 90/**题目1: * 给定一个字符串"Aaaa ... -
四种操作xml的方式: SAX, DOM, JDOM , DOM4J的比较
2010-10-25 13:43 57四种操作xml的方式: SAX, DOM, JDOM ... -
用Dom4j解析XML及中文问题
2010-10-25 13:42 301用Dom4j解析XML及中文问题(转载) ... -
Dom4j的使用(转至CSDN)
2010-10-25 13:32 74Dom4j 使用简介 DOM4J ... -
JSON入门二
2010-10-25 13:29 652JSON 的真正价值 正如在上一篇文章 中所描 ... -
JSON入门一
2010-10-25 13:27 694在异步应用程序中发送和接收信息时,可以选择以纯文本和 X ... -
a href="#" 与 a href="javascript:void(0)" 的区别(转)
2010-10-25 13:25 773a href="#" 与 a h ... -
浅谈java中的冒泡排序法
2010-10-25 13:13 1852冒泡排序法 冒泡 ... -
浅谈java中的选择排序法
2010-10-25 13:12 1401选择排序法 选择 ... -
约瑟夫环2
2010-10-25 13:06 210方法二:用面向对象的思想来解决问题 在同一个包里新建 ... -
约瑟夫环
2010-10-25 13:03 1064著名的约瑟夫环问题详解 问题概述: 已知n个人( ... -
Java中实现对象比较的几个相关概念
2010-10-25 12:54 782在Java中实现对象比较的几个相关概念(转) 一、跟对象 ...
相关推荐
二分查找 C语言语言源代码 用递归写的 C语言入门经典代码 值得收藏
二分查找,也称为折半查找,是一种在有序数据集中查找特定元素的算法。它的高效性使得二分查找在多种应用场景中成为首选的搜索算法。下面我们将从原理、应用、性能分析及扩展变种等方面进行详细探讨。 二分查找的...
顺序查找表 二分查找表 折半查找表 二叉排序树 C#源代码 注意二叉排序树只实现了查找和插入算法,使用Visual Studio 2008开发
用C语言开发的递归和非递归二分查找算法,具体内容详见代码
分别用递归和非递归方法实现二分查找算法 的完整程序,indexof()返回的是循环实现的二分法查找,getindex()实现的是递归算法实现的二分法查找。
折半(二分)查找算法C语言源程序,首先借助于快速排序算法对数组进行从小到大的排序,然后折半进行查找,直到找到相应数字为止。
在⼀个升序的数组中查找制定的数字n,很容易想到的⽅法就是遍历数组,但是这种⽅法效率⽐较低, ⽐如我买了一件衣服,你好奇问我多少钱,我说不超过300元。...此文件就是关于C语言的二分查找的代码
数据结构 折半查找 实例代码: /* 名称:折半查找 语言:数据结构C语言版 编译环境:VC++ 6.0 日期: 2014-3-26 */ #include #include #include <windows> #define N 11 // 数据元素个数 typedef int Key...
C语言折半查找、二分查找
折半查找法也叫做二分查找,顾名思义,就是把数据分成两半,再判断所查找的key在哪一半中,再重复上述步骤知道找到目标key; 注意:折半查找法仅适用于对已有顺序的数组、数据进行操作!!! 很显然,折半查找法相...
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表...
本文实例讲述了C++二分查找(折半查找)算法。分享给大家供大家参考,具体如下: 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。 因此,折半查找...
输入两个数,查找位于位于这两数区间的序列
二分査找也称折半査找,其优点是查找速度快,缺点是要求所要査找的数据必须是有序序列。该算法的基本思想是将所要査找的序列的中间位置的数据与所要査找的元素进行比较,如果相等,则表示査找成功,否则将以该位置为...
顺序查找及二分查找等的代码(C语言),以及对链表的各种操作,增删改查
问题:给定一个有序(非降序)数组A,可含有重复元素,求最小的i使得A[i]等于target,不存在则返回-1,例如:A[2,4,6,8,8,8,9]求8得最小位置3的相关代码。
如果前者比后者小,则要查找的数据必然在数组的前半部,此后只需在数组的前半部中继续折半查找;如果前者的数值比后者大,则要查找的数据必然在数组的后半部,此后只需在数组的后半部继续进行折半查找。 5.编程...
范例1-8 查找矩阵的马鞍点 19 ∷相关函数:Get_Saddle函数 1.1.9 对角矩阵建立 21 范例1-9 对角矩阵建立 21 ∷相关函数:Store函数 1.1.10 三对角矩阵的建立 22 范例1-10 三对角矩阵的建立 22 ∷相关函数:...
1.二分查找又称为折半查找,它要求要查找的顺序表必须是有序表,即表中结点按关键字有序.并且要用顺序存储结构。 基本思想是:首先将给定值key与表中中间位置记录的关键字相比较,若二者相等,则查找成功,否则...