Vbscript在DataGridView中折半查找某一行


'Binary search an item in a certain table's certain column
'Writer         Markin.Q.Li
'Create Date    2013-4-24
'Return         RowIndex
'min            The min row index
'max            The max row index
'Item           Config node name
'Table          The table object on the form
'Col_index      The column index we search in
'Example        BinarySearch(0, 100, ItemName, Table, 1)
Function BinarySearch(min, max, Item, Table, Col_index)

   Dim MidData
   Dim MaxMidData
   Dim LowMidData
  
	If((min + max)/2 =Fix((min + max)/2)) Then
		MidData = (min + max)/2
		'msgbox("Min:  " & min & "  Max:  " & max & "  Mid: "  & MidData & "---" & Table.GetCellData(MidData, Col_index)&"---" & Item)

			If Ucase(RTrim(Item)) =  Ucase(RTrim(Table.GetCellData(MidData, Col_index))) Then
				BinarySearch = MidData
				Exit Function
			ElseIf Ucase(RTrim(Item)) > Ucase(RTrim(Table.GetCellData(MidData, Col_index))) Then
				min = MidData
				BinarySearch = BinarySearch(min, max, Item, Table, Col_index)
			Elseif Ucase(RTrim(Item)) < Ucase(RTrim(Table.GetCellData(MidData, Col_index))) Then
				max = MidData
				BinarySearch = BinarySearch(min, max, Item, Table, Col_index)
			Else 
				BinarySearch = -1
				Exit Function
			End If
	Else
		LowMidData = Fix((min + max)/2)
		MaxMidData = Fix((min + max)/2) + 1

		'msgbox("Min:  " & min & "  Max:  " & max & "  Mid: "  & LowMidData & "--" & MaxMidData & "---"&Table.GetCellData(LowMidData, Col_index)& "--" &Table.GetCellData(MaxMidData, Col_index)&"---"&Item)

		If Ucase(RTrim(Item)) > Ucase(RTrim(Table.GetCellData(MaxMidData, Col_index))) Then
				min = MaxMidData
				BinarySearch = BinarySearch(min, max, Item, Table, Col_index)
			Elseif  Ucase(RTrim(Item)) < Ucase(RTrim(Table.GetCellData(LowMidData, Col_index))) Then
				max = LowMidData
				BinarySearch = BinarySearch(min, max, Item, Table, Col_index)
			Elseif  Ucase(RTrim(Item)) = Ucase(RTrim(Table.GetCellData(LowMidData, Col_index))) Then
				BinarySearch = LowMidData
				Exit Function
			Elseif Ucase(RTrim(Item)) = Ucase(RTrim(Table.GetCellData(MaxMidData, Col_index))) Then
				BinarySearch = MaxMidData
				Exit Function			
			Else 
				BinarySearch = -1
				Exit Function
		End If
	End If
End Function

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章