Function ListviewBinarySearch

|

| Parameters :

| listview: listview to search, assumed to be sorted, must

| be <> nil.

| Item : item caption to search for, cannot be empty

| index : returns the index of the found item, or the

| index where the item should be inserted if it is not

| already in the list.

| Returns : True if there is an item with the passed caption

| in the list, false otherwise.

| Description:

| Uses a binary search and assumes that the listview is sorted

| ascending on the caption of the listitems. The search is

| case-sensitive, like the default alpha-sort routine used by

| the TListview class.

| Note:

| We use the lstrcmp function for string comparison since it

| is the function used by the default alpha sort routine. If

| the listview is sorted by another means (e.g. OnCompare event)

| this needs to be changed, the comparison method used must

| always be the same one used to sort the listview, or the

| search will not work!

| Error Conditions: none

Code:

{+------------------------------------------------------------

| Function ListviewBinarySearch

| +------------------------------------------------------------}

 

function ListviewBinarySearch(listview: TListview; const Item: string;

  var Index: Integer): Boolean;

var

  First, last, pivot, res: Integer;

begin

  Assert(Assigned(listview));

  Assert(Length(item) > 0);

 

  Result := False;

  Index := 0;

  if listview.Items.Count = 0 then Exit;

 

  First := 0;

  last  := listview.Items.Count - 1;

  repeat

    pivot := (First + last) div 2;

    res   := lstrcmp(PChar(item), PChar(listview.Items[pivot].Caption));

    if res = 0 then

    begin

      { Found the item, return its index and exit. }

      Index := pivot;

      Result := True;

      Break;

    end { If }

    else if res > 0 then

    begin

      { Item is larger than item at pivot }

      First := pivot + 1;

    end { If }

    else

    begin

      { Item is smaller than item at pivot }

      last := pivot - 1;

    end;

  until last < First;

  Index := First;

end; { ListviewBinarySearch }

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить