home *** CD-ROM | disk | FTP | other *** search
/ Chip 1999 May / Chip_1999-05_cd.bin / zkuste / vbasic / Data / Priklady / trideni.bas < prev    next >
BASIC Source File  |  1999-03-08  |  6KB  |  227 lines

  1. Attribute VB_Name = "Module1"
  2. 'Modul: TRIDENI.BAS  Autor: Gⁿrtler Martin
  3. '
  4. 'Modul vysv∞tluje na n∞kolika zßkladnφch algoritmech principy t°φd∞nφ
  5. 'prvk∙ v poli. Obsahuje Üest znßm²ch t°φdφcφch mechanism∙ ve form∞ procedur.
  6. 'Pokud najdete v algoritmech n∞jakΘ chyby, napiÜte mi prosφm na adresu
  7. 'prior_ik@ova.comp.cz
  8.  
  9. 'Funkce zam∞nφ dva prvky v poli
  10. Private Sub swap(ByRef a, ByRef b)
  11.   Dim tmp
  12.  
  13.   tmp = a
  14.   a = b
  15.   b = tmp
  16. End Sub
  17.  
  18.  
  19. '╪azenφ v²b∞rem (select sort)
  20. 'Postup:
  21. '
  22. '1.      najdi nejmenÜφ prvek
  23. '2.      dej ho na prvnφ mφsto
  24. '3.      najdi druh² nejmenÜφ prvek
  25. '4.      dej ho na druhΘ mφsto
  26. '5.      à (atd)
  27. '
  28. 'Zßkladnφ algoritmus
  29. '
  30. 'Public Sub SelectSort(ByRef p As Variant)
  31. '  Dim i As Long, j As Long
  32. '
  33. '  For i = 1 To UBound(p) - 1
  34. '    For j = i + 1 To UBound(p)
  35. '      If p(j) < p(i) Then swap p(i), p(j)
  36. '    Next j
  37. '  Next i
  38. 'End Sub
  39. '
  40. 'Definujeme-li n jako poΦet prvk∙ vápoli. Potom je efektivita algoritmu nßsledujφcφ:
  41. '
  42. 'poΦet porovnßnφ - (n-2)*(n-1), co₧ je asi n2
  43. 'poΦet v²m∞n     - (n-2)*(n-1), tedy takΘ n2
  44. 'Trvß-li jedna v²m∞na p°ibli₧n∞ 1/1000 sekundy, nenφ tento algoritmus moc
  45. 'efektivnφ. Proto jej upravφme tak, ₧e v²m∞na prvk∙ prob∞hne a₧ po nalezenφ
  46. 'minimßlnφho prvku.
  47.  
  48. Public Sub SelectSort(ByRef p As Variant)
  49.   Dim i As Long, j As Long, x As Long, iMin As Long
  50.  
  51.   x = UBound(p)
  52.   For i = 1 To x - 1
  53.     iMin = i
  54.     For j = i + 1 To x
  55.       If p(j) < p(iMin) Then iMin = j
  56.     Next j
  57.     swap p(i), p(iMin)
  58.   Next i
  59. End Sub
  60.  
  61. '╪azenφ bublinkovΘ (bubble sort)
  62. 'Princip bublinkovΘho spoΦφvß vátzv. probublßvßnφ nejv∞tÜφch prvk∙ na svΘ mφsto.
  63. 'Zßkladnφ algoritmus vypadß takto:
  64. '
  65. 'For i = 1 To ubound(p) - 1
  66. '  For j = 1 To ubound(p) - 1
  67. '    If p(j) > p(j + 1) Then swap x(j), x(j + 1)
  68. '  Next j
  69. 'Next i
  70. '
  71. 'Tento algoritmus by Üel zrychlit ·pravou druhΘho °ßdku na °ßdek For j=1 To n-i,
  72. 'stßle vÜak bude cyklus probφhat i kdy₧ u₧ bude pole se°azenΘ, proto algoritmus
  73. 'upravφme nßsl.: cyklus bude probφhat, jen kdy₧ probφhß v²m∞na.
  74. '
  75. Public Sub BubbleSort(ByRef p As Variant)
  76.   Dim i As Long, j As Long
  77.   Dim bez_Zmeny As Boolean
  78.   
  79.   i = 1
  80.   Do
  81.     bez_Zmeny = True
  82.     For j = 1 To UBound(p) - 1
  83.       If p(j) > p(j + 1) Then
  84.         swap p(j), p(j + 1)
  85.         bez_Zmeny = False
  86.       End If
  87.     Next j
  88.     i = i + 1
  89.   Loop Until bez_Zmeny
  90. End Sub
  91.  
  92.  
  93. '╪azenφ vklßdßnφm (insert sort)
  94. 'Princip tohoto t°φd∞nφ spoΦφvß váumφst∞nφ aktußlnφho prvku na jeho sprßvnou
  95. 'pozici. Algoritmus prochßzφ pole od prvnφho prvku a aktußlnφ prvek vklßdß
  96. 'na sprßvnΘ mφsto (tj. na nejbli₧Üφ pozici vlevo, kde je prvek vlevo menÜφ
  97. 'ne₧ aktußlnφ prvek).
  98. '
  99. 'Public Sub InsertSort(ByRef p As Variant)
  100. '  Dim i As Long, j As Long
  101. '  Dim tmp
  102. '
  103. '  For i = 2 To UBound(p)
  104. '    tmp = p(i)
  105. '    j = i - 1
  106. '    Do While (tmp < p(j) And (j > 0))
  107. '      p(j + 1) = p(j)
  108. '      j = j - 1
  109. '    Loop
  110. '    p(j + 1) = tmp
  111. '  Next i
  112. 'End Sub
  113. '
  114. 'Aby byl algoritmus efektivn∞jÜφ, m∙₧eme sekvenΦnφ vyhledßvßnφ sprßvnΘho mφsta
  115. 'pro vlo₧enφ prvku nahradit binßrnφm vyhledßvßnφm:
  116.  
  117. Public Sub InsertSort(ByRef p As Variant)
  118.   Dim i As Long, j As Long, l As Long, r As Long, m As Long
  119.   Dim tmp
  120.  
  121.   For i = 2 To UBound(p)
  122.     l = 1: r = i - 1
  123.     tmp = p(i)
  124.     Do While l <= r
  125.       m = (l + r) \ 2   'CeloΦφselnΘ d∞lenφ
  126.       If tmp < p(m) Then
  127.         r = m - 1
  128.       Else
  129.         l = m + 1
  130.       End If
  131.     Loop
  132.     For j = i - 1 To l Step -1
  133.       p(j + 1) = p(j)
  134.     Next j
  135.     p(l) = tmp
  136.   Next i
  137. End Sub
  138.  
  139. 'VÜechny v²Üe uvedenΘ algoritmy majφ pom∞rn∞ velkou Φasovou slo₧itost û n2
  140. 'Nynφ se budeme zab²vat efektivn∞jÜφmi (rychlejÜφmi) algoritmy. Proto₧e by byl
  141. 'popis, jak algoritmus funguje, p°φliÜ obsßhl², odkazuji Φtenß°e na n∞jakou
  142. 'odbornou literaturu, kde najdete kompletnφ popis funkce t∞chto algoritm∙
  143.  
  144. Public Sub ShellSort(ByRef p As Variant)
  145.   Dim gap As Long, i As Long, j As Long, x As Long
  146.  
  147.   x = UBound(p)
  148.   gap = x \ 2
  149.  
  150.   Do While gap > 0
  151.     For i = gap To x - 1
  152.       j = i - gap + 1
  153.       Do While (j >= 1)
  154.         If (p(j) > p(j + gap)) Then Exit Do
  155.         swap p(j), p(j + gap)
  156.         j = j - gap
  157.         If j < 1 Then j = 0
  158.       Loop
  159.     Next i
  160.     gap = gap \ 2
  161.   Loop
  162. End Sub
  163.  
  164. 'Procedura potrebna pro proceduru HeapSort
  165. Private Sub Sift(l As Long, r As Long, ByRef p As Variant)
  166.   Dim j As Long, i As Long, pom
  167.   Dim jeste As Boolean
  168.   
  169.   j = 2 * l
  170.   pom = p(l)
  171.   i = l
  172.   jeste = j < r
  173.   Do While jeste
  174.     If p(j + 1) > p(j) Then j = j + 1
  175.     If p(j) > pom Then
  176.       swap p(j), p(i)
  177.       i = j
  178.       j = 2 * i
  179.       jeste = j < r
  180.     Else
  181.       jeste = False
  182.     End If
  183.   Loop
  184. End Sub
  185.  
  186. Public Sub HeapSort(ByRef p As Variant)
  187.   Dim i As Long, n As Long
  188.   
  189.   n = UBound(p)
  190.   For i = n \ 2 To 1 Step -1
  191.     Sift i, n, p
  192.   Next i
  193.   For i = n To 3 Step -1
  194.     swap p(i), p(1)
  195.     Sift 1, i - 1, p
  196.   Next i
  197.   If p(1) > p(2) Then swap p(1), p(2)
  198. End Sub
  199.  
  200. 'Procedura potrebna pro proceduru QuickSort
  201. Private Sub Sorting(l As Long, r As Long, ByRef p As Variant)
  202.   Dim i As Long, j As Long, pom
  203.   
  204.   i = l
  205.   j = r
  206.   pom = p((l + r) \ 2)
  207.   Do
  208.     Do While p(i) < pom
  209.       i = i + 1
  210.     Loop
  211.     Do While p(j) > pom
  212.       j = j - 1
  213.     Loop
  214.     If i <= j Then
  215.       swap p(i), p(j)
  216.       i = i + 1
  217.       j = j - 1
  218.     End If
  219.   Loop Until i > j
  220.   If l < j Then Sorting l, j, p
  221.   If i < r Then Sorting i, r, p
  222. End Sub
  223.  
  224. Public Sub QuickSort(ByRef p As Variant)
  225.   Sorting 1, UBound(p), p
  226. End Sub
  227.