2016-03-20 2 views
0

Я попытался реализовать quicksort, используя псевдокод из книги (выглядит так, как из Википедии), но я не могу заставить его работать.Quicksort не работает хорошо

Этот исходный код:

int partitionare(int a[], int n, int p, int r) 
{ 
    int x, i, j, aux; 
    x = a[r]; // pivot 
    i = p - 1; 
    for (j = p; j < r; j++) 
    { 
     if (a[j] <= x) 
     { 
      i++; 
      aux = a[j]; 
      a[j] = a[i]; 
      a[i] = aux; 
     } 
    } 
    aux = a[i + 1]; 
    a[i + 1] = a[r]; 
    a[r] = aux; 
    return i + 1; 
} 
void quicksort(int a[], int n, int p, int r) 
{ 
    if (p < r) 
    { 
     int q = partitionare(a, n, p, r); 
     partitionare(a, n, p, q - 1); 
     partitionare(a, n, q + 1, r); 
    } 
} 

где р и г самого начало и конец массива

И вызов функции:

quicksort(a, n, 0, n-1); 

Не против того, что второй аргумент, n. Это только для целей тестирования.

+2

Что вы имеете в виду, не работает? Какие результаты вы видите для своего тестового ввода? –

+0

Упс, извините, я забыл упомянуть. Вход: 2, 8, 7, 1, 3, 5, 6, 4 Выход: 2, 1, 3, 4, 7, 5, 6, 8 – Altair2033

ответ

1

Accoding к Wikipedia article последних вызовов внутри функции quicksort() имеют себе рекурсивно (не к функции partition())

void quicksort(int a[], int n, int p, int r) 
{ 
    if (p < r) 
    { 
     int q = partitionare(a, n, p, r); 
     partitionare(a, n, p, q - 1);  /* recursive quicksort() here */ 
     partitionare(a, n, q + 1, r);  /* recursive quicksort() here */ 
    } 
} 
+0

Мой бог, он работает. Так было и в моей книге, но эффективно, я был слепым. И эта проблема заняла у меня 10 часов. Вы, сэр, спасатели жизни. Большое спасибо. :) – Altair2033

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