Реализация сортировки слиянием в python3 - PullRequest
0 голосов
/ 07 декабря 2018

Я не знаю, что здесь не так.Может ли кто-нибудь помочь мне сделать сортировку слиянием в python3.Пожалуйста, где я ошибся ....?

def merge_help(a,b):
    c=[]
    j=0
    i=0
    while(i<len(a) and j<len(b)):
        if(a[i]>=b[j]):
            c.append(b[j])
            j+=1
        elif(a[i]<=b[j]):
            c.append(a[i])
            i+=1
    while(j<len(b)):
        c.append(b[j])
        j+=1
    while(i<len(a)):
        c.append(a[i])
        i+=1
    return c
    def merge(a):
    if(len(a)>1):
        mid =len(a)//2
        l=a[:mid]
        r=a[mid:]
        merge(l)
        merge(r)
        merge_help(l,r)
    print(a)

merge([12,11,13,5,6,7]) не работает .... нет ошибок, но тот же список возвращается обратнокаждый рекурсивный шаг

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Вы не фиксируете вывод merge_help, поэтому вы фактически не изменяете значения в списке 'a'.

Вы также пытаетесь сделать это на месте, что невозможно при слиянииsort.

В вашей функции слияния сделайте следующее:

def merge(a):
    if(len(a) > 1):
        # Divide the list in two
        mid = len(a)//2
        left_unsorted = a[:mid]
        right_unsorted = a[mid:]

        # Sort both halves
        left_sorted = merge(left_unsorted)
        right_sorted = merge(right_unsorted)

        # Merge the two sorted lists
        a_sorted = merge_help(left_sorted, right_sorted)
    else:
        a_sorted = a.copy()
    return a_sorted

Примечание: это не сортирует переданный список;он возвращает только отсортированную версию.Поэтому, если вы вызовете его с помощью orig_list, orig_list в конце не изменится.

0 голосов
/ 07 декабря 2018

Вы добавляете поля от a и b к c, но в конце вы печатаете a.Может быть, это проблема.

Массив a никогда не редактируется

...