Szybkie sortowanie quicksort

0

Hej :) Czy ktoś mi podpowie, gdzie tu jest błąd? Wyskakuje mi "index out of range". Help me. Proszę. : D

def dziel(tablica, s, k):
    pivot = int((s+k)/2)
    tablica[s], tablica[pivot] = tablica[pivot], tablica[s]
    for i in range(s+1, k+1):
        if tablica[i] <= tablica[s]:
            pivot = pivot+1
            tablica[pivot], tablica[i] = tablica[i], tablica[pivot]
    tablica[pivot], tablica[s] = tablica[s], tablica[s]
    return pivot

def quickSort(tablica, s, k):
    if s<k:
        pivot=dziel(tablica, s, k)
        quickSort(tablica, s, pivot-1)
        quickSort(tablica, pivot+1, k)
    return tablica
1

for i in range(s+1, k+1): czyli maksymalny indeks jaki uzyskasz to k a twoja tablica ostatni indeks ma na k-1

0

To już zmieniłem, ale nadal mi coś "miesza". W wyniku sortowania dostaję taką tablicę:
[7, 4, 7, 17, 17, 8, 17, 23, 23, 24, 27, 25, 27, 28, 16, 28, 29, 29, 2, 29, 31, 31, 21, 31, 34, 32, 34, 3, 34, 35, 39, 37, 39, 44, 44, 45, 45, 45, 42, 45, 43, 45, 49, 46, 49, 50, 47, 50, 51, 36, 51, 53, 52, 53, 57, 63, 61, 63, 61, 63, 64, 58, 64, 68, 68, 65, 68, 69, 69, 57, 69, 74, 74, 75, 75, 76, 76, 76, 40, 76, 78, 77, 78, 81, 86, 87, 82, 87, 92, 96, 96, 77, 96, 96, 96, 97, 98, 100, 99, 100]

0

Mój kod:

import random
def init():
    tablica=[]
    for i in range (0, 100):
        tablica.append(random.randint(0, 100))
    return tablica
def dziel(tablica, s, k): 
    pivot = int((s+k)/2)
    tablica[s], tablica[pivot] = tablica[pivot], tablica[s]
    pivot = s
    for i in range(s+1, k):
        if tablica[i] <= tablica[s]:
            pivot = pivot+1
            tablica[pivot], tablica[i] = tablica[i], tablica[pivot]
    tablica[pivot], tablica[s] = tablica[s], tablica[s]
    return pivot

def quickSort(tablica, s, k):
    if s<k:
        pivot=dziel(tablica, s, k)
        quickSort(tablica, s, pivot-1)
        quickSort(tablica, pivot+1, k)
    return tablica

tab1 = init()
print(tab1)
print(quickSort(tab1, 0, 100))
1
maxmiks napisał(a):

Mój kod:

import random
def init():
    #tablica = [random.randint(0, 100) for _ in range(100)] #<== Tu generator zadziała szybciej i jest czytelny równie jak linie poniższe ;p. Albo zamiast 'tablica =' możesz od razu napisać 'return' [(...)
    tablica=[]
    for i in range (0, 100):
        tablica.append(random.randint(0, 100))
    return tablica

def dziel(tablica, s, k): 
    pivot = int((s+k)/2)
    tablica[s], tablica[pivot] = tablica[pivot], tablica[s]
    pivot = s
    for i in range(s+1, k):
        if tablica[i] <= tablica[s]:
            pivot = pivot+1 #A tu ci się zapewne pojawia błąd - bo jeśli twój pivot wyniesie w wyniku wielu przestawień indeks k (ostatni) i go zwiększysz, to wychodzisz poza zakres.
            #pivot = pivot+1 if pivot<k else pivot-1
            tablica[pivot], tablica[i] = tablica[i], tablica[pivot]
    tablica[pivot], tablica[s] = tablica[s], tablica[s]
    return pivot

def quickSort(tablica, s, k):
    if s<k:
        pivot=dziel(tablica, s, k)
        quickSort(tablica, s, pivot-1)
        quickSort(tablica, pivot+1, k)
    return tablica

tab1 = init()
print(tab1)
print(quickSort(tab1, 0, 100))

Spróbuj z tymi wskazówkami, jeśli zadziała, to w te stronę musisz się bawić :)
Jeśli nie, to wyślij cały błąd który wylatuje :d

1 użytkowników online, w tym zalogowanych: 0, gości: 1