2014-10-31 8 views
0

Я написал реализацию Quicksort в Python, используя алгоритм, который преподавал Седжвик в своем курсе. Я не могу сортировать его должным образом. Что не так с кодом?Невозможно реализовать Quicksort

def partition(a, lo, hi): 
    i = lo 
    j = hi 
    v = a[lo] 
    while(True): 
     while(a[i] < v): 
      i += 1 
      if (i == hi): break 

     while(a[j] > v): 
      j -= 1 
      if (j == lo): break 

     if (i >= j): break 

     a[i], a[j] = a[j], a[i] 

    a[lo], a[j] = a[j], a[lo] 
    return j 

def sort(a, lo, hi): 
    if (hi <= lo): 
     return 
    q = partition(a, lo, hi) 
    sort(a, lo, q-1) 
    sort(a, q+1, hi) 
    assert isSorted(a, lo, hi) 

def quick_sort(a): 
    shuffle(a) 
    sort(a, 0, len(a)-1) 
    assert isSortedArray(a) 
+0

Кроме того, вам не хватало удачи в выборе сообщества StackExchange спросить, если ничего другого. (Как вы сортируете одну реализацию quicksort?) – greybeard

ответ

0

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


Возвратившись новый список:

def qsort(array): 
    if len(array) < 2: 
     return array 
    head, *tail = array 
    less = qsort([i for i in tail if i < head]) 
    more = qsort([i for i in tail if i >= head]) 
    return less + [head] + more 

Сортировка списка в месте:

def quicksort(array): 
    _quicksort(array, 0, len(array) - 1) 

def _quicksort(array, start, stop): 
    if stop - start > 0: 
     pivot, left, right = array[start], start, stop 
     while left <= right: 
      while array[left] < pivot: 
       left += 1 
      while array[right] > pivot: 
       right -= 1 
      if left <= right: 
       array[left], array[right] = array[right], array[left] 
       left += 1 
       right -= 1 
     _quicksort(array, start, right) 
     _quicksort(array, left, stop) 

Создание отсортированы элементы из итератора:

def qsort(sequence): 
    iterator = iter(sequence) 
    head = next(iterator) 
    try: 
     tail, more = chain(next(iterator), iterator), [] 
     yield from qsort(split(head, tail, more)) 
     yield head 
     yield from qsort(more) 
    except StopIteration: 
     yield head 

def chain(head, iterator): 
    yield head 
    yield from iterator 

def split(head, tail, more): 
    for item in tail: 
     if item < head: 
      yield item 
     else: 
      more.append(item) 
+0

Просьба ссылаться на то, где вы нашли справочные реализации в своем ответе. –

+0

Я написал справочные реализации, но их можно найти, по крайней мере, в одном другом ответе здесь, в StackOverflow, и они были первоначально отправлены в Rosetta Code после недовольства другими существующими реализациями. –

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