CHOWFA
Nov 5th, 2001, 08:26 AM
Can someone explain why my lines don't redraw properly in my quicksort tutorial?
Here's the code...
Sub Quicksort(List() As Integer, min As Integer, max As Integer)
' If the list has no more than 1 element, it's sorted.
If min >= max Then Exit Sub
' Pick a dividing item.
i = Int((max - min + 1) * Rnd + min)
med_value = List(i)
' Swap it to the front so we can find it easily.
List(i) = List(min)
' Move the items smaller than this into the left
' half of the list. Move the others into the right.
lo = min
hi = max
Do
' Look down from hi for a value < med_value.
Do While List(hi) >= med_value
hi = hi - 1
If hi <= lo Then Exit Do
Loop
If hi <= lo Then
List(lo) = med_value
Exit Do
End If
' Swap the lo and hi values.
Form1.Line (2400 + lo * 50, 0)-(2400 + lo * 50, List(lo)), vbBlue
Form1.Line (2400 + hi * 50, 0)-(2400 + hi * 50, List(hi)), vbBlue
'delay
Sleep (100)
Form1.Line (2400 + lo * 50, 0)-(2400 + lo * 50, List(lo)), vbBlack
Form1.Line (2400 + hi * 50, 0)-(2400 + hi * 50, List(hi)), vbBlack
List(lo) = List(hi)
Sleep (100)
Form1.Line (2400 + lo * 50, 0)-(2400 + lo * 50, List(lo)), vbGreen
Form1.Line (2400 + hi * 50, 0)-(2400 + hi * 50, List(hi)), vbGreen
' Look up from lo for a value >= med_value.
lo = lo + 1
Do While List(lo) < med_value
lo = lo + 1
If lo >= hi Then Exit Do
Loop
If lo >= hi Then
lo = hi
List(hi) = med_value
Exit Do
End If
' Swap the lo and hi values.
Form1.Line (2400 + lo * 50, 0)-(2400 + lo * 50, List(lo)), vbBlue
Form1.Line (2400 + hi * 50, 0)-(2400 + hi * 50, List(hi)), vbBlue
'delay
Sleep (100)
Form1.Line (2400 + lo * 50, 0)-(2400 + lo * 50, List(lo)), vbBlack
Form1.Line (2400 + hi * 50, 0)-(2400 + hi * 50, List(hi)), vbBlack
List(hi) = List(lo)
Sleep (100)
Form1.Line (2400 + lo * 50, 0)-(2400 + lo * 50, List(lo)), vbGreen
Form1.Line (2400 + hi * 50, 0)-(2400 + hi * 50, List(hi)), vbGreen
Loop
' Sort the two sublists
Quicksort List(), min, lo - 1
Quicksort List(), lo + 1, max
End Sub
Thank You
Here's the code...
Sub Quicksort(List() As Integer, min As Integer, max As Integer)
' If the list has no more than 1 element, it's sorted.
If min >= max Then Exit Sub
' Pick a dividing item.
i = Int((max - min + 1) * Rnd + min)
med_value = List(i)
' Swap it to the front so we can find it easily.
List(i) = List(min)
' Move the items smaller than this into the left
' half of the list. Move the others into the right.
lo = min
hi = max
Do
' Look down from hi for a value < med_value.
Do While List(hi) >= med_value
hi = hi - 1
If hi <= lo Then Exit Do
Loop
If hi <= lo Then
List(lo) = med_value
Exit Do
End If
' Swap the lo and hi values.
Form1.Line (2400 + lo * 50, 0)-(2400 + lo * 50, List(lo)), vbBlue
Form1.Line (2400 + hi * 50, 0)-(2400 + hi * 50, List(hi)), vbBlue
'delay
Sleep (100)
Form1.Line (2400 + lo * 50, 0)-(2400 + lo * 50, List(lo)), vbBlack
Form1.Line (2400 + hi * 50, 0)-(2400 + hi * 50, List(hi)), vbBlack
List(lo) = List(hi)
Sleep (100)
Form1.Line (2400 + lo * 50, 0)-(2400 + lo * 50, List(lo)), vbGreen
Form1.Line (2400 + hi * 50, 0)-(2400 + hi * 50, List(hi)), vbGreen
' Look up from lo for a value >= med_value.
lo = lo + 1
Do While List(lo) < med_value
lo = lo + 1
If lo >= hi Then Exit Do
Loop
If lo >= hi Then
lo = hi
List(hi) = med_value
Exit Do
End If
' Swap the lo and hi values.
Form1.Line (2400 + lo * 50, 0)-(2400 + lo * 50, List(lo)), vbBlue
Form1.Line (2400 + hi * 50, 0)-(2400 + hi * 50, List(hi)), vbBlue
'delay
Sleep (100)
Form1.Line (2400 + lo * 50, 0)-(2400 + lo * 50, List(lo)), vbBlack
Form1.Line (2400 + hi * 50, 0)-(2400 + hi * 50, List(hi)), vbBlack
List(hi) = List(lo)
Sleep (100)
Form1.Line (2400 + lo * 50, 0)-(2400 + lo * 50, List(lo)), vbGreen
Form1.Line (2400 + hi * 50, 0)-(2400 + hi * 50, List(hi)), vbGreen
Loop
' Sort the two sublists
Quicksort List(), min, lo - 1
Quicksort List(), lo + 1, max
End Sub
Thank You