有序表的静态查找算法折半查找

今天在看到数据结构 静态表的查找的时候,看到一个算法挺有意思,理解也 比较容易。

这是一个有序表的查找算法,比如(2,3,4,5,11,22,23,44,55,57,88)这样的有序结构。

折半查找(binary search)的过程:先确定带查记录所在的范围或者区间,然后逐步缩小范围,直到找到或者找不到该记录为止。

比如待查的记录key是23.

刚开始low的位置1,high的位置是11.那么中间的mid的位置是(1+11)/2;

相对于的结构对象arr[low/mid/hight]可以找到对应的各个数据记录。

2,3,4,5,11,22,23,44,55,57,88

|                |                   |

low              mid                 high

使用arr[mid]与key进行大小比较。 因为arr[mid]=22 而且<key。说明待查的记录key在 arr[mid] 和arr[high]中间。

所以设置 low 指向mid+1,high不变,mid 仍然是(low + high)/2. 如此论推,知道arr[mid]=key找到记录或者low=high找不到key

下面是伪代码描述

EQ函数:判断两个数值是否相等

LQ(a,b)函数:判断数值a是否大于数字b;

int Search(int arr[],int key)//返回记录在arr中的位置

{

    int low = 1;//描述位置

    int high = arr.length;

    while(low <= high)

     {

        mid = (low + high)/2;

        if(EQ(key,arr[mid])) return mid;

        else if(LQ(key,arr[mid])) low = mid + 1

         else high = mid -1;

      }

     return 0;

}

 折半查找比顺序查找效率高,但是只适合有序表,而且限制必须是顺序结构存储的数据(线性链表无法使用折半查找法)。

本文使用Blog_Backup未注册版本导出,请到soft.pt42.com注册。

原文地址:https://www.cnblogs.com/zjypp/p/2319401.html