2016-06-16 2 views
0

Я пытаюсь написать свой первый алгоритм быстрой сортировки в течение нескольких часов, но все равно не получаю это правильно. Цель состоит в том, чтобы написать быстрый код сортировки для сортировки массива. Я хочу использовать две функции: рекурсивную функцию quick_sort и функцию разделения.Быстрая сортировка не работает после первого раздела

Я обнаружил, что функция разбиения кажется корректной для каждой подматрицы, сгенерированной разделом и покорением, но возвращаемый полный массив, казалось, не изменился после первого раздела (первый раздел имеет эффект, а второй, третий разделы , ..., казалось, не имеет никакого эффекта).

Должно быть, я что-то пропустил, какие-то намеки?

def partition(a, first, last):  
    x = a[0] 
    j = 0 

    for i in range((first+1), (last+1)): 

     if x >= a[i]: 
      j = j + 1 
      a[i], a[j] = a[j], a[i]  
    a[0], a[j] = a[j], a[0] 

    return j 

def quicksort(a): 
    quick_sort(a, 0, len(a) - 1) 

def quick_sort(a, first, last): 

    if first < last:  
     j = partition(a, first, last) 
     # devide a into two parts and do quicksort respectively 
     quicksort(a[:j]) 
     quicksort(a[j+1:]) 

    return a 

a = [6.5, 4, 2, 3, 9, 8, 9, 4, 7, 6, 1] 
quicksort(a) 
+1

a [: j] - это другой массив, a копия. Вы должны использовать quicksort (a, first, j), quicksort (a, j + 1, last) – UmNyobe

+0

Это именно то место, где я пропустил! Большое спасибо UmNyobe – enaJ

ответ

2

Заменить этот

quicksort(a[:j]) 
quicksort(a[j+1:]) 

Для

quick_sort(a,first,j-1) 
quick_sort(a,j+1,last) 

Поскольку вы звоните quicksort(a) это Willl сделать снова только первую итерацию, Ьс установить низкий и высокий, как первой итерации все время, поэтому для его сохранения вы должны назвать рекурсивный, используя j

Смежные вопросы