Avatar billede sunero Nybegynder
14. juni 2005 - 13:30 Der er 4 kommentarer og
1 løsning

Quicksort, stigende eller faldende

Jeg har fundet nedenstående quicksort funktion hos 4guysfromRolla. Den virker rigtigt fint, men jeg mangler en lille ting, som jeg ikke selvkan gennemskue.

Hvordan kan man få funktionen til at sortere faldende og ikke stigende, som den gør nu ?

___________

Sub QuickSort(vec,loBound,hiBound,SortField)

  '==--------------------------------------------------------==
  '== Sort a 2 dimensional array on SortField                ==
  '==                                                        ==
  '== This procedure is adapted from the algorithm given in: ==
  '==    ~ Data Abstractions & Structures using C++ by ~    ==
  '==    ~ Mark Headington and David Riley, pg. 586    ~    ==
  '== Quicksort is the fastest array sorting routine for    ==
  '== unordered arrays.  Its big O is  n log n              ==
  '==                                                        ==
  '== Parameters:                                            ==
  '== vec      - array to be sorted                        ==
  '== SortField - The field to sort on (2nd dimension value) ==
  '== loBound and hiBound are simply the upper and lower    ==
  '==  bounds of the array's 1st dimension.  It's probably  ==
  '==  easiest to use the LBound and UBound functions to    ==
  '==  set these.                                          ==
  '==--------------------------------------------------------==

  Dim pivot(),loSwap,hiSwap,temp,counter
  Redim pivot (Ubound(vec,2))

  '== Two items to sort
  if hiBound - loBound = 1 then
    if vec(loBound,SortField) > vec(hiBound,SortField) then Call SwapRows(vec,hiBound,loBound)
  End If

  '== Three or more items to sort
 
  For counter = 0 to Ubound(vec,2)
    pivot(counter) = vec(int((loBound + hiBound) / 2),counter)
    vec(int((loBound + hiBound) / 2),counter) = vec(loBound,counter)
    vec(loBound,counter) = pivot(counter)
  Next

  loSwap = loBound + 1
  hiSwap = hiBound
 
  do
    '== Find the right loSwap
    while loSwap < hiSwap and vec(loSwap,SortField) <= pivot(SortField)
      loSwap = loSwap + 1
    wend
    '== Find the right hiSwap
    while vec(hiSwap,SortField) > pivot(SortField)
      hiSwap = hiSwap - 1
    wend
    '== Swap values if loSwap is less then hiSwap
    if loSwap < hiSwap then Call SwapRows(vec,loSwap,hiSwap)


  loop while loSwap < hiSwap
 
  For counter = 0 to Ubound(vec,2)
    vec(loBound,counter) = vec(hiSwap,counter)
    vec(hiSwap,counter) = pivot(counter)
  Next
   
  '== Recursively call function .. the beauty of Quicksort
    '== 2 or more items in first section
    if loBound < (hiSwap - 1) then Call QuickSort(vec,loBound,hiSwap-1,SortField)
    '== 2 or more items in second section
    if hiSwap + 1 < hibound then Call QuickSort(vec,hiSwap+1,hiBound,SortField)

End Sub  'QuickSort
Avatar billede busschou Praktikant
14. juni 2005 - 14:24 #1
jeg er ikke sort ekspert, men mon ikke der skal vendes om på nogle af < tegnene
--
'== Swap values if loSwap is less then hiSwap
    if loSwap < hiSwap then Call SwapRows(vec,loSwap,hiSwap)
loop while loSwap < hiSwap
--
så hvis den swapper når noget er mindre end noget andet, så skal den i stedet gøre det når det er større
--
'== Swap values if loSwap is less then hiSwap
    if loSwap > hiSwap then Call SwapRows(vec,loSwap,hiSwap)
loop while loSwap > hiSwap
Avatar billede sunero Nybegynder
14. juni 2005 - 17:00 #2
Ja, det er også der jeg ca. er kommet til. Problemet er bare hvor :-)
Avatar billede busschou Praktikant
14. juni 2005 - 17:01 #3
i princrippet ville jeg gætte på dem alle,,,hehe men er ikke sikker på om det er rigtigt..men det må forholdsvis hurtigt kunne afprøves
Avatar billede ksoren Nybegynder
14. juni 2005 - 22:18 #4
Dem der skal vendes, er dem som sammenligner indholdet af arrayet. Den første er

vec(loBound,SortField) > vec(hiBound,SortField)
Avatar billede sunero Nybegynder
15. juni 2005 - 16:35 #5
Jeg lukker spørgsmålet. Jeg har løst det ved at læse mit array fra bunden
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester