Есть такой вариант сортировки "пузырьком" ? - VB

Узнай цену своей работы

Формулировка задачи:

Всегда сортировал "пузырьком" по примеру от БурундукЪ из верхней части раздела. Вчера пытался написать код по памяти и не смог - пришлось смотреть... Потом пришла идейка сделать чуток иначе и получил более быстрый вариант Подскажите: есть ли такой вариант в "природе" ?? Если есть, то почему тогда выложен более медленный ?? На форме только две кнопки. Покликайте по обеим и увидите время на цикл 1000...

Решение задачи: «Есть такой вариант сортировки "пузырьком" ?»

textual
Листинг программы
Dim a(40) As Long, b(40), N, V
 
' Selectionsort.
Public Sub Selectionsort(List() As Long, min As Long, max As Long)
Dim i As Long
Dim j As Long
Dim best_value As Long
Dim best_j As Long
 
    For i = min To max - 1
        best_value = List(i)
        best_j = i
        For j = i + 1 To max
            If List(j) < best_value Then
                best_value = List(j)
                best_j = j
            End If
        Next j
        List(best_j) = List(i)
        List(i) = best_value
    Next i
End Sub
Private Sub Command1_Click()
If V <> 1 Then Print "БурундукЪ вариант": V = 1:
tim1 = Timer
 
For cikl = 1 To 1000
 For i = 0 To N - 1: a(i) = b(i): Next i:
'---------
 For i = 0 To N - 1
  For j = 0 To N - 2 - i
   If a(j) > a(j + 1) Then
     Tmp = a(j)
     a(j) = a(j + 1)
     a(j + 1) = Tmp
    End If
   Next j
  Next i
'---------
 
Next cikl
 
tim2 = Timer: Print Str(Round(tim2 - tim1, 4))
 
End Sub
 
Private Sub Command2_Click()
If V <> 2 Then Print "Другой вариант": V = 2:
tim1 = Timer
 
For cikl = 1 To 1000
 For i = 0 To N - 1: a(i) = b(i): Next i:
'---------
 For i = 0 To N - 2: 'или  For i = 0 To Ubound(a)-1:
   If a(i) > a(i + 1) Then
    For j = i To 0 Step -1
     If a(j) < a(j + 1) Then Exit For
     xx = a(j): a(j) = a(j + 1): a(j + 1) = xx:
    Next j:
   End If
 Next i:
'---------
 
Next cikl
 
tim2 = Timer: Print Str(Round(tim2 - tim1, 4))
 
End Sub
 Public Sub Quicksort(List() As Long, ByVal min As Long, ByVal max As Long)
Dim med_value As Long
Dim hi As Long
Dim lo As Long
Dim i As Long
    If max - min < CutOff Then
        Selectionsort List(), min, max
        Exit Sub
    End If
    i = Int((max - min + 1) * Rnd + min)
    med_value = List(i)
    List(i) = List(min)
    lo = min
    hi = max
    Do
         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
 
        List(lo) = List(hi)
     
        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
        List(hi) = List(lo)
    Loop
    
    ' Sort the two sublists.
    Quicksort List(), min, lo - 1
    Quicksort List(), lo + 1, max
End Sub
 
 
Private Sub Command3_Click()
tim1 = Timer
For cikl = 1 To 1000
 For i = 0 To N - 1: a(i) = b(i): Next i:
Quicksort a(), 0, 40
Next cikl
tim2 = Timer: Print "Quicksort " & Str(Round(tim2 - tim1, 4))
 
End Sub
 
Private Sub Form_Load()
Me.AutoRedraw = True
N = 41:
For i = 0 To N - 1: Randomize Timer
a(i) = Int(Rnd(1) * 99): 'Print Str(a(i))
b(i) = a(i):
Next i:
End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.333 из 5
Похожие ответы