delphi实现二分查找


本文整理自网络,侵删。

 
假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

条件:数组必须先排好序 

优点:查找速度快,适用于不经常变动频繁查找的有序列表

缺点:插入删除困难

假设其数组长度为n,其算法复杂度为o(log(n))

function TForm1.binarySearch(a: array of Integer;n:Integer): Integer;
var
  istart, iend, middle: Integer; //定义数组开始下标 和结束下标     中间下标
begin
  istart :=Low(a);
  iend :=High(a);
  while (istart<=iend) do
  begin
    middle:=Trunc((istart+iend)/2);
    if a[middle]=n then    //如果中间位置数为该数则返回该数位置,退出循环
    begin
      Result:=middle;
      Exit;
    end
    else if a[middle]>n then iend:=middle-1  //中间位置数大于该数,则去掉后一子表 继续查询
    else if a[middle]<n then istart:=middle+1; //中间位置数小于该数,则去掉前一子表  继续查询
  end;
  Result:=-1;
end;

procedure TForm1.buttonClick(Sender: TObject);
const
  myarray:array[1..10] of Integer=(1,3,5,6,7,9,10,11,14,16);
begin
  ShowMessage(IntToStr(binarySearch(myarray,14)));
end;

相关阅读 >>

Delphi form工程创建

Delphi reset 以只读方式打开文件

Delphi中实现dll文件自动注册

Delphi datasnap 获取客户端ip

Delphi10.2.3解决的一个json问题

Delphi unigui unistringgrid1 清空

Delphi 将被其他窗体遮住的窗体弹到最前面

Delphi判断mssql数据库中表格是否存在? 如何批量创建表格?

Delphi xe5也可以开发 google glass应用

Delphi 关于 "高位" 与 "低位"

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...