核心提示:function BinarySearch(a: TArrayStock; key: string; n: integer): integer;varmyvalue: string;i, iLen,...
function BinarySearch(a: TArrayStock; key: string; n: integer): integer;var
myvalue: string;
i, iLen, Low, Mid, High: integer;
begin
Low := 0;
High := N - 1;
i := 0;
iLen := Length(key);
while (Low <= High) do
begin
Mid := Round((Low + High) / 2);
myvalue := Copy(A[Mid].StockCode, 1, iLen);
if (myvalue < key) then
Low := Mid + 1
else if (myvalue > key) then
High := Mid - 1
else begin
//找到值,并不能保证是最小的那个重复值。
//因为是排序好的数据,所以还取所有前驱和后继节点之值 ;
//取所有前驱节点之值
with FrmExcelQuery do
begin
for i := Mid - 1 downto Low do
begin
if Copy(A[i].StockCode, 1, iLen) <> myvalue then break;
lst1.Items.Add(A[i].StockCode+ ' ' + FArrCode[i].SecuAbbr);
end;
lst1.Items.Add(A[Mid].StockCode+ ' ' + FArrCode[i].SecuAbbr);
//取所有后继节点之值;
for i := Mid + 1 to High do
begin
if Copy(A[i].StockCode, 1, iLen) <> myvalue then break;
lst1.Items.Add(A[i].StockCode+ ' ' + FArrCode[i].SecuAbbr);
end;
lst1.Left := edtCode.Left;
lst1.Top := edtCode.Top + edtCode.Height + 1;
lst1.ItemIndex := 0;
lst1.Visible := true;
end;
result := Mid;
exit;
end;
end;
result := -1;
end;