Я пытаюсь реализовать быструю сортировку в Python, но выходной список либо пропускает элементы, либо повторяет их - PullRequest
0 голосов
/ 26 мая 2020

Я очень новичок в программировании и хотел реализовать quicksort после просмотра диаграмм, приведенных в моей книге. Однако я не получаю желаемый отсортированный список, так как некоторые элементы либо не добавляются, либо повторяются. Я подозреваю, что проблема в том, как я использую рекурсию для сортировки списка.

array = [52, 5, 45, 2, 78, 1, 9, 57, 3]
global less_pivot_list
global greater_pivot_list

def quicksort(array):
    global less_pivot_list
    global greater_pivot_list

    if len(array) < 2:
        return array
    elif len(array) == 2:
        if array[0] > array[1]:
            temp = array[0]
            array[0] = array[1]
            array[1] = temp
        return array 
    else:
        pivot_index = 0
        pivot = array[pivot_index]
        list_pivot = [pivot]
        less_pivot_list = [item for item in array if pivot > item]
        greater_pivot_list = [item for item in array if pivot < item]   
        return quicksort(less_pivot_list) + list_pivot + quicksort(greater_pivot_list)

output = quicksort(array)
print(output)

Вот результат: [1, 2, 3, 5, 3, 52, 3]

1 Ответ

0 голосов
/ 26 мая 2020

Удалите глобальное объявление внутри функции

array= [52,5,45,2,78,1,9,57,3]
less_pivot_list = []
greater_pivot_list = []

def quicksort(array):

   if len(array)<2:
       return array
   elif len(array)==2:
       if array[0] > array[1]:
           temp = array[0]
           array[0] = array[1]
           array[1]= temp
       return array 
   else:
    pivot_index=0
    pivot=array[pivot_index]
    list_pivot=[pivot]
    less_pivot_list = [item for item in array if pivot > item]
    greater_pivot_list = [item for item in array if pivot < item]   
    return quicksort(less_pivot_list) +list_pivot+ quicksort(greater_pivot_list)

output=quicksort(array)
print(output)

, в результате вывод будет правильно отсортирован.

...