2013-02-28 2 views
0

Я работаю над быстрой сортировкой из моей структуры данных и алгоритмов. В книге он перечисляет метод quicksort, а затем раздел hoare, который он хочет использовать для быстрой сортировки. Кажется, у меня проблема, когда мой раздел hoare использует номера границ в массиве. Либо он использует 8, либо я пытаюсь исправить то, что он идет до -1. Я правильно переписываю книги в java?Работа с quicksort

Quicksort псевдокод

QuickSort(A, p, r) 
if p<r 
    q = partition(A, p, r); 
    QuickSort(A, p, q - 1); 
    QuickSort(A, q, r); 

Хора-Partition псевдокоде

Hoare-Partition(A,p,r) 
    x= A[p] 
    i = p-1 
    j=r+1 
    while true 
     repeat 
      j=j-1 
     until A [j] <= x 
     repeat 
      i = i +1 
     until A[i] >= x 
     if i < l 
      exchange A[i] with A[j] 
     else return j 

Мой код

public class RunSort { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     int[] sortNumbers = {4,5,6,2,3,7,2,1}; 
     int[] sorted = new int[sortNumbers.length]; 

     sorted = QuickSort(sortNumbers, 1, sortNumbers.length); 
     System.out.print(sorted); 
    } 

    public static int[] QuickSort(int[] A, int p, int r){ 
     if(p < r){ 
      int q = partition(A, p, r); 
      QuickSort(A, p, q - 1); 
      QuickSort(A, q, r); 
     } 
     return A; 

    } 

    public static int partition(int[] A, int p, int r){ 
     int x = A[p]; 
     int i = p - 1; 
     int j = r + 1; 
     int temp; 

     while(true){ 
      while(A[j] <= x && j != 0){ 
       j--; 
      } 
      while(A[i] >= x && i != A.length){ 
       i++; 
      } 
      if(i < j){ 
       temp = A[i]; 
       A[i] = A[j]; 
       A[j] = temp; 
      }else{ 
       return j; 
      } 
     } 
    } 
} 

ответ

2

Подсказка: repeat {...} until (condition) не делать то же самое, как while (condition) {...}.

+0

О, я вижу, куда я пошел неправильно. Я тестирую его, пока это не состояние. – shinjuo

+0

Правильно ли это было бы изменено while (A [j]> x) { \t \t \t \t j--; \t \t \t} \t \t \t в то время как (А [я] <х) { \t \t \t \t я ++; \t \t \t} – shinjuo

+0

Я думаю, что 'do {...} while (! Condition)' будет ближе к тому, что вы хотите. 'while (condition) {...}' оценивает условие * перед * выполнением блока, что на самом деле не совпадает с тем, что описывает псевдокод 'repeat'. –

0

В зависимости от текста псевдокод часто использует 1..arrayLength в качестве границ индекса для массива, но в Java и др. Это 0..arrayLength-1. Вам необходимо настроить аргументы на главный вызов QuickSort в main.

(В придираться, QuickSort должен начинаться со строчной буквы по соглашению.)

+0

Я пробовал, что ему все равно не нравится – shinjuo