2015-11-18 6 views
2

Я пытаюсь написать простой метод в java, который будет выполнять quicksort по int [], но я получаю одно значение, которое неуместно в моих результатах.Невозможно прекрасно реализовать QuickSort

Любая помощь, чтобы понять, куда я иду, будет оценена по достоинству. Ниже приведен мой код:

public static void quickSort(int[] arr, int left, int right){ 
    if (left < right){ 
     int p = partition(arr, left, right); 
     quickSort(arr, left, p-1); 
     quickSort(arr, p+1, right); 
    } 
} 

public static int partition(int[] arr, int left, int right){ 
    int pivot = arr[left]; 
    int l = left+1; 
    int r = right; 
    while (l < r){ 
     while (l<right && arr[l] < pivot){ 
      l++; 
     } 
     while (r>left && arr[r] > pivot){ 
      r--; 
     } 
     if (l < r){ 
      int temp = arr[l]; 
      arr[l] = arr[r]; 
      arr[r] = temp; 
     } 
    } 
    arr[left] = arr[r]; 
    arr[r] = pivot;   
    return r; 
} 
+1

Что делать, если 'right' равно' left + 1'? Эти два элемента обмениваются без какого-либо ключевого сравнения. (О, и сравнение 'r> left' является избыточным, если ось остается в' arr [left] 'до тех пор, пока цикл не будет.) – greybeard

ответ

0

Ваш код идеален, но не забудьте указать правильные значения методу quickSort.

 int[] arr = .....; 
     int left = 0; 
     int right = arr.length - 1; 

    public static void quickSort(int[] arr, int left, int right){ 
+0

Именно это я предоставляю в качестве параметров. – RajveerParikh

0

Эти две линии с подозрением:

quickSort(arr, p+1, right);

и

int l = left+1;

Принимая правую боковую перегородку, вы пропуская первый элемент массива? Некоторые примеры тестовых примеров и их выход были бы полезны для добавления.

+0

Насколько я понимаю, я не пропускаю никаких значений. Когда я использовал отладчик, я также заметил, что он сначала сортирует его правильно, а затем снова переключает. По крайней мере, во втором тестовом случае. Это один тестовый пример, который я пробовал: Входной массив: 8 5 9 10 12 9 6 12 13 19 22 14 17 21 5 1 4 3 2 Результат: 1 2 3 4 5 5 6 8 9 9 10 12 12 13 17 14 19 21 22 Второй испытательный корпус: Входной массив: 8 5 9 10 12 7 6 13 19 22 14 17 21 5 1 4 3 2 Результат: 1 2 3 4 5 5 7 6 8 9 10 12 13 14 17 19 21 22 – RajveerParikh

0

Я изменил ваш метод разделения. Я стараюсь делать незначительные изменения, в основном для разрыва цикла.

public static int partition(int[] arr, int left, int right) { 
    int pivot = arr[left]; 
    int l = left ; 
    int r = right+1; 
    while (true) { 
     while (arr[++l] < pivot) { 
      if (l >= right) 
       break; 
     } 
     while (arr[--r] > pivot) { 
      if (r <= left) 
       break; 
     } 
     if (l >= r) 
      break; 
     int temp = arr[l]; 
     arr[l] = arr[r]; 
     arr[r] = temp; 
    } 
    arr[left] = arr[r]; 
    arr[r] = pivot; 
    return r; 
} 

Я тестировал ниже сценарии и работает.

int[] arr = { 9, 5, 10, 8, 2, 3, 4, 7, 6, 1 }; 
int[] arr = { 9, 5, 10, 8, 2, 9, 5, 10, 8, 2 }; 
quickSort(arr, 0, arr.length - 1); 
System.out.println(Arrays.toString(arr)); 
+0

Спасибо за это. Я не могу понять, почему это имеет значение, но я попытаюсь реализовать это в своем коде и посмотреть, если он это сделает. – RajveerParikh

+0

Добавление инструкций break для выхода из цикла while похоже на это. Не знаю, почему это так. – RajveerParikh

+0

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

0

Схема разделения Hoare использует p и p + 1 в вызовах быстрой сортировки. Я преобразовал рабочую программу на Java. Я переключил ось вращения в середину, поэтому отсортированные или обратные отсортированные массивы не являются худшим случаем.

public static void quickSort(int[] arr, int left, int right){ 
    if (left < right){ 
     int p = partition(arr, left, right); 
     quickSort(arr, left, p); 
     quickSort(arr, p+1, right); 
    } 
} 

public static int partition(int[] arr, int left, int right){ 
    int pivot = arr[(left+right)/2]; 
    int l = left-1; 
    int r = right+1; 
    while (true){ 
     while (arr[++l] < pivot); 
     while (arr[--r] > pivot); 
     if (l >= r) 
      break; 
     int temp = arr[l]; 
     arr[l] = arr[r]; 
     arr[r] = temp; 
     } 
    } 
    return r; 
} 
Смежные вопросы