Implementacja sortowania MergeSort

Implementacja sortowania MergeSort
MIkiti
  • Rejestracja:ponad 3 lata
  • Ostatnio:prawie 2 lata
  • Postów:11
0
Kopiuj
def mergesort(a, p, q):
    mid = (p + q) // 2
    k = p
    r = mid + 1
    while k <= mid and r <= q:
        if a[k] > a[r]:
            temp = a[k]
            a[k] = a[r]
            i = k + 1
            while i <= q:
                s = a[i]
                a[i] = temp
                temp = s
            r += 1
        else:
            k += 1
    return

def merge(a, p, q):
    if p < q:
        mid = (p + q) // 2
        merge(a, p, mid)
        merge(a, mid + 1, q)
        mergesort(a, p, q)
    else:
        return


tab = [1, 5, 2, 4, 3, 7, 6, 9, 8]
dl = len(tab) - 1
merge(tab, 0, dl)
print(tab)
edytowany 2x, ostatnio: Riddle
S4
  • Rejestracja:około 3 lata
  • Ostatnio:ponad rok
  • Postów:1268
2

A co jest nie tak?

MIkiti
  • Rejestracja:ponad 3 lata
  • Ostatnio:prawie 2 lata
  • Postów:11
0
S4t napisał(a):

A co jest nie tak?

no właśnie nie chce mi posortować w sensie przestaje wywoływać się funkcja po kilku wywołaniach

KE
  • Rejestracja:ponad 6 lat
  • Ostatnio:3 minuty
  • Postów:682
0

Dodaj duuuużo printów. I może spróbuj na prostszych przypadkach - posortuj 0,1,2,3-elementową listę. Dojdziesz gdzie jest błąd :)

MIkiti
  • Rejestracja:ponad 3 lata
  • Ostatnio:prawie 2 lata
  • Postów:11
0
kelog napisał(a):

Dodaj duuuużo printów. I może spróbuj na prostszych przypadkach - posortuj 0,1,2,3-elementową listę. Dojdziesz gdzie jest błąd :)

Kolejne wywołania są takie, bo sprawdziłem:
merge( 0 8 )
merge( 0 4 )
merge( 0 2 )
merge( 0 1 )
merge( 0 0 )
merge( 1 1 )
mergesort( 0 1 )
merge( 2 2 )
mergesort( 0 2 )
i sie konczy na tym, a powinno sie jeszcze wywołać sporo wiecej przecież następny powinien byc już (3, 4)

Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:Wrocław
  • Postów:13042
3

Linijka dziesiąta to nieskończona pętla.


Paweł Tometczak
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad rok
  • Postów:31
0
Kopiuj
def mergesort(a, p, q):
    mid = (p + q) // 2
    i = p
    j = mid + 1
    k = 0
    temp = [0] * (q - p + 1)
    while i <= mid and j <= q:
        if a[i] <= a[j]:
            temp[k] = a[i]
            i += 1
        else:
            temp[k] = a[j]
            j += 1
        k += 1
    while i <= mid:
        temp[k] = a[i]
        i += 1
        k += 1
    while j <= q:
        temp[k] = a[j]
        j += 1
        k += 1
    for i in range(q - p + 1):
        a[p + i] = temp[i]

def merge(a, p, q):
    if p < q:
        mid = (p + q) // 2
        merge(a, p, mid)
        merge(a, mid + 1, q)
        mergesort(a, p, q)

tab = [1, 5, 2, 4, 3, 7, 6, 9, 8]
dl = len(tab) - 1
merge(tab, 0, dl)
print(tab)


Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.