2012-06-25 3 views
2

Я только что реализовал алгоритм QuickSort из книги и получил странный результат. Он работает, но он сортируется в порядке убывания, а не возрастает. Например: [1, 5, 2, 10, 6, 9, 8, 3, 7, 4] сортируется [10, 9, 8, 7, 6, 5, 4, 3, 2, 1] чтобы найти источник в моем коде:Быстрый поиск Сортировка по убыванию Не возрастанию

private void quicksort(int[] A, int p, int r) { 
    if (p < r) { 
     int q = partition(A, p, r); 
     quicksort(A, p, q); 
     quicksort(A, q + 1, r); 
    } 
} 

private int partition(int[] A, int p, int r) { 
    int x = A[p]; // pivot 
    int i = p; 
    int j = r; 
    while (true) { 

     while (A[i] > x) { 
      i++; 
     } 

     while (A[j] < x) { 
      j--; 
     } 
     if (i < j) { 
      int temp = A[i]; 
      A[i] = A[j]; 
      A[j] = temp; 
     } else { 
      return j; 
     } 
    } 
} 

ИСХОДНЫЙ CALL:

quicksort(A, 0, A.length - 1); 

как я вычислить сложность пространства для сортировки?

спасибо ребята

+1

Пожалуйста, не спрашивай два разных вопроса в том же вопросе. Для вашего второго вопроса вы, вероятно, должны просто использовать Google. –

+1

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

+0

O (N^2) - худший случай. Среднее и лучшее - O (log N) – squiguy

ответ

3

Это в вашей функции раздела, вы сортировки в порядке убывания.

while(true) { 
//ignore all the numbers greater than X to left 
while (A[i] > x) { 
     i++; 
    } 
//ignore all numbers lesser than X to right 
while (A[j] < x) { 
     j--; 
} 

//swap a number lesser than X on left with a number greater than X on right 
    if (i < j) { 
     int temp = A[i]; 
     A[i] = A[j]; 
     A[j] = temp; 
     i++; 
     j--; 
    } else { 
     //Now the array is so sorted, that all numbers lesser than X are on right of it and greater than X are to left of it. Hence return position of X 
     return j; 
    } 
} 

// для восходящих:

while(true) { 

while (A[i] < x) { 
     i++; 
} 

while (A[j] > x) { 
     j--; 
} 

    if (i < j) { 
     int temp = A[i]; 
     A[i] = A[j]; 
     A[j] = temp; 
     i++; 
     j--; 
    } else { 
     return j; 
    } 
} 
+1

спасибо, что я только что изменил A [i] x, и он отсортирован по возрастанию. – GGio

+0

он работает для тестирования, которое я представил в своем вопросе, но если я тестирую на этом входе, он переходит в бесконечный цикл: \t \t int [] A = {1, 5, 1, 2, 10, 6, 9, 8, 3, 7, 4}; – GGio

+0

ах, думал о том же. подождите, я обновлю свой ответ – manuskc

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