2013-03-22 3 views
0

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

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

// quicksort the subarray from a[lo] to a[hi] 
private void sort(Comparable[] a, int lo, int hi) { 
    if((hi-lo)>1){ 
     int pivot = partition(a,lo,hi); 
     sort(a,lo,pivot); 
     sort(a,pivot+1,hi); 
    } 
} 

// partition the subarray a[lo .. hi] by returning an index j 
// so that a[lo .. j-1] <= a[j] <= a[j+1 .. hi] 
private int partition(Comparable[] a, int lo, int hi) { 
    //find middle 
    int pivotIndex = (hi+lo)/2; 
    //pick pivot 
    Comparable pivot = a[pivotIndex]; 
    //create left and right pointers 
    int left = lo, right = hi; 
    //start comparing 
    //compare until left passes right 
    while(left<right){ 
     //while left is less than pivot move on 
     while(a[left].compareTo(pivot) < 0) left++; 
     //while right is greater than pivot move on 
     while(a[right].compareTo(pivot) > 0) right--; 
     //if the pointers have passed each other we're done 
     //if a[left] is greater than a[right] swap them 
     if(a[left].compareTo(a[right]) > 0){ 
      Comparable holder = a[left]; 
      a[left] = a[right]; 
      a[right] = holder; 
      //increment/decrement 
      left++; right--; 
     } 
    } 
    return right; 
} 
+0

Это javascript? : p –

+0

@GrzegorzKaczan довольно уверен, что это не так. перенаправлен в java. –

ответ

0

Просто удалите left++; right--; и все должно быть хорошо.

+0

Я еще не нашел ошибку, но я запустил тестовый пример сортировки 'Character [] s = {'z', 'y', 'x', 'a', 'b', 'c', ' w ',' v ',' u '}; 'и удаление' left ++; right -; 'не исправил проблему. – Simon

+0

Довольно странно .. Я немного подумал об этом, и я думаю, что что-то об рекурсивных вызовах идет не так. Но я не могу видеть ошибку напрямую. Просто взгляните на реализации http://www.vogella.com/articles/JavaAlgorithmsQuicksort/article.html (что очень похоже на ваше), но рекурсия более или менее внутри раздела. – fish

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