折半查找算法实现

折半查找是一种比较高效的查找方式,其基本思想是:在某个有序表中,取出中间的记录作为比较对象,如果要查找记录的关键码等于中间记录的关键码,则查找成功;若要查找记录的关键码小于中间记录的关键码,则在中间记录的左半区继续查找;若查找记录的关键码大于中间记录的关键码,则在中间记录的右半区继续查找。不断重复上述查找过程,直到查找成功,或有序表没有所要查找的记录,查找失败。实现过程有两种方式递归法和非递归法。

1.非递归法:查找成功则返回位置,查找失败则范围-1.

/////////////////////////////////////////////////
     //非递归查找1. numVec为待查找的集合2.x为待查找数值 3.beg为查找范围起始 4.last为查找范围结束
    /////////////////////////////////////////////////
int Bisearch::BiSearch(vector<int> numVec,int x,int beg,int last){
         int mid;//中间位置
         if(beg>last){ //beg开始位置大于last结束位置,目前只考虑升序状态下
         return -1;
         }  
         while(beg<=last){
               mid =(beg+last)/2; 
               if(x==numVec[mid]){//x(关键码)刚好跟中间值(numVec[mid])相同
               return mid;
         }else if(x>numVec[mid]){//x(关键码)大于中间值(numVec[mid]),起点定位到mid+1
               beg = mid +1;
          }else if(x<numVec[mid]){//x(关键码)小于于中间值(numVec[mid]),终点定位到mid-1
               last = mid -1;
         }
      }
         return -1;
}

2.递归法:

int Bisearch::IterBiSearch(vector<int> numVec,int x,int beg,int last){
       //中间位置初始化为-1
       int mid =-1;
       mid = (beg+ last)/2;
       if(x==numVec[mid]){
        return mid;
       }else if(x<numVec[mid]){
             return IterBiSearch(numVec,x,beg,mid-1);
       }else if(x>numVec[mid]){
              return IterBiSearch(numVec,x,mid+1,last);
 }
     return -1;
}

时间: 2024-08-10 14:59:14

折半查找算法实现的相关文章

java 二分查找 - 折半查找算法

二分查找: 这个算法是比较简单的,容易理解的.这个算法是对有序的数组进行查找,所以想要使用这个算法那么 首先先要对数组进行排序. 其实有三个指针,开始指针,末尾指针,中间指针,来开始.折半查找. 步骤如下: 1.确定三个指针,start,end,middleIndex. 2.判断start<=end,如果满足,就执行这个方法,不满足,就返回,找不到. 3.在2的前提下,我们对其折半查找,middleIndex = start+end >> 1,取中间值. 4.判断中间位置的值和目标值是否

二分查找/折半查找算法

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用中间位置记录将表分成前.后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表.重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功. class Pr

折半查找算法的使用中防止溢出的问题

维基上的代码: int binary_search(int A[], int key, int imin, int imax) { // continue searching while [imin,imax] is not empty while (imax >= imin) { // calculate the midpoint for roughly equal partition int imid = midpoint(imin, imax); if(A[imid] == key) //

折半查找算法

package algorithm; public class BinarySearch { public static int search(int a[], int key) {        int low = 0;         int high = a.length - 1;        int mid = 0;        while (low <= high) {            mid = (low + high)/2;            if (a[mid] =

算法:顺序查找与折半查找

资料摘自:<数据结构c++语言描述> typedef int DataType; //顺序查找算法 //用顺序查找在n元数组list中查找与key等值的元素,返回该数组元素的下标 //若未找到,则返回-1 int SeqSearch(DataType List[], int n, DataType key) { for(int i = 0; i < n; i++) { if(List[i] == key) { return i; } } return -1; } /* *顺序查找的复杂度

快速排序及折半查找

数据结构与算法---快速排序及折半查找: 1)编程实现数据序列的输入2)实现快速排序算法,并对输入的序列排序后输出: 3)实现折半查找算法,并在步骤(2)排序后的序列上,进行任意地查找,并输出查询结果.(查找成功/不成功:等于关键值的元素个数=1或>1) 1 #include <stdio.h> 2 #define N 100 3 4 //快速排序算法并输出 5 void Quick_Partition(double *r, int i, int j) 6 { 7 double x =

查找与排序02,折半查找

折半查找,也叫二分查找,当在一个数组或集合中查找某个元素时,先定位出中间位置元素,如果要查找的元素正好和该中间位置元素相等,通过一次查找,就能找到匹配元素:如果要查找的元素小于该中间位置元素,就抛弃后面一半的元素,在前面一半的元素中再定位出中间位置元素,如此反复,直到找到匹配元素:如果要查找的元素大于该中间位置元素,就抛弃前面一半的元素,在后面一半的元素中定位出中间位置元素,如此反复. 面临的第一个问题是:中间位置元素如何定位?在折半查找中规定:当元素个数是奇数,比如有3个元素,中间位置元素是索

对分查找法(二分查找法,折半查找法)

二分查找法是针对已经排好序的序列进行查找 每次折半查找 算法时间复杂度,对于长度为N的序列,每次执行N/2,假设k次结束,最后到第一个N/2^k=0,所以k=logN 时间复杂度logN int binarysearch(const int array[], int x, int N) { int low, mid, high; low = 0, high = N - 1; while (low <= high) { mid = (low + high) / 2; if(array[mid] <

折半查找的递归改写

[问题描述] 针对以非递增有序表表示的静态查找表,编写递归的折半查找算法. [输入形式]该静态查找表从下标1开始存放数据,存放数据按照非递增顺序,具体输入形式如下: 5   //输入元素个数 33 29 25 20 12 //按照非递增顺序连续输入多个数,每个数之间用一个空格隔开 29 //输入需要查找的数[输出形式]如果找到则输出该数据在查找表中的下标,如果找不到则输出0 如 查找29则会输出2[样例输入]5 33 29 25 20 12 29 [样例输出] 2 #include<stdio.