Ich war ursprünglich nur eine einzige zufällige Dreh vonWie verbessere ich meine schnelle Sortierauswahl in Python?
pivots = random.randrange(l,r)
Hier l und r gegeben mit ganzen Zahlen sein, die meinen Bereich definieren
ich die Laufzeit durch eine starke Erhöhung der wahrscheinlich Haube verbessern wollte, dass mein Pivot wäre ein guter Drehpunkt, indem der Median von drei zufälligen Pivots ausgewählt wird. Unten ist der Code, den ich verwendet habe, und es hat meine Laufzeit um 20% -30% erhöht.
rr = random.randrange
pivots = [ rr(l,r) for i in range(3) ]
pivots.sort()
Wie kann ich das oben genannte implementieren, um viel schneller zu sein?
Edit: Entire Code hinzugefügt unter
import random
def quicksort(array, l=0, r=-1):
# array is list to sort, array is going to be passed by reference, this is new to me, try not to suck
# l is the left bound of the array to be acte on
# r is the right bound of the array to act on
if r == -1:
r = len(array)
# base case
if r-l <= 1:
return
# pick the median of 3 possible pivots
#pivots = [ random.randrange(l,r) for i in range(3) ]
rr = random.randrange
pivots = [ rr(l,r) for i in range(3) ]
pivots.sort()
i = l+1 # Barrier between below and above piviot, first higher element
array[l], array[pivots[1]] = array[pivots[1]], array[l]
for j in range(l+1,r):
if array[j] < array[l]:
array[i], array[j] = array[j], array[i]
i = i+1
array[l], array[i-1] = array[i-1], array[l]
quicksort(array, l, i-1)
quicksort(array, i, r)
return array
Edit 2: Dies ist der korrigierte Code fällig. Es gab in den Algorithmus ein Fehler zum Aufnehmen der 3 schwenkt
import random
def quicksort(array, l=0, r=-1):
# array is list to sort, array is going to be passed by reference, this is new to me, try not to suck
# l is the left bound of the array to be acte on
# r is the right bound of the array to act on
if r == -1:
r = len(array)
# base case
if r-l <= 1:
return
# pick the median of 3 possible pivots
mid = int((l+r)*0.5)
pivot = 0
#pivots = [ l, mid, r-1]
if array[l] > array[mid]:
if array[r-1]> array[l]:
pivot = l
elif array[mid] > array[r-1]:
pivot = mid
else:
if array[r-1] > array[mid]:
pivot = mid
else:
pivot = r-1
i = l+1 # Barrier between below and above piviot, first higher element
array[l], array[pivot] = array[pivot], array[l]
for j in range(l+1,r):
if array[j] < array[l]:
array[i], array[j] = array[j], array[i]
i = i+1
array[l], array[i-1] = array[i-1], array[l]
quicksort(array, l, i-1)
quicksort(array, i, r)
return array
Es ist seltsam klingen. Warum sollte Ihr Drehpunkt besser sein, wenn Sie den Median von drei zufälligen Drehpunkten verwenden? –
Wir müssen den Rest Ihres Codes sehen. – Kevin
Ihre Pivot-Auswahl ist wirklich seltsam ... Sollte der Pivot nicht ein Element der Liste sein, um zu sortieren (vermutlich 'l')? – mgilson