Есть такой вариант сортировки "пузырьком" ? - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д