2017-02-11 2 views
0

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

Ниже мой код:

public class MyClass { 
private int array[]; 

public void setArray(int[] arr){ 
    this.array=arr; 
    quickSort(0,array.length-1); 

    } 

    private int length; 
    private void quickSort(int lowIndex, int highIndex){ 
     int pivot = array[lowIndex+(highIndex-lowIndex/2)]; // our pivot 
     int i = lowIndex; 
     int j = highIndex; 
     while(i<=j){ 
      while(array[i]<pivot){ 
       i++; 
      } 
      while(array[j]>pivot){ 
       j--; 
      } 
      if(i<=j){ 
       int temp = array[i]; 
       array[j] = array[i]; 
       array[i] = temp; 
       i++; 
       j--; 
      } 

     } 
     if(lowIndex<j){ 
      quickSort(lowIndex, j); 
     } 
     if(highIndex>i){ 
      quickSort(i, highIndex); 
     } 


    } 


    public static void main(String[] args) { 
     int[] array2 = {2,45,96,1,16}; 
    MyClass b = new MyClass(); 
    b.setArray(array2); 
    for(int x=0;x<array2.length;x++){ 
     System.out.print(array2[x]+" "); 
    } 
    } 
} 
+0

1> Я думаю, что вы имеете в виду, что во время выполнения вы получаете исключение из-за границ. 2> Есть ли номер строки, прикрепленный к ошибке? Где это относится к вашему фрагменту кода? – synchronizer

+4

'highIndex-lowIndex/2' - это не то, что вы думаете. – user2357112

ответ

0

Все, что вы пропустили это набор круглых скобок за исполнение Порядок операций. Ваш выход ошибка это:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6 
    at MyClass.quickSort(MyClass.java:12) 
    at MyClass.quickSort(MyClass.java:35) 
    at MyClass.setArray(MyClass.java:6) 
    at MyClass.main(MyClass.java:45)  

И все, что вам нужно, чтобы исправить это исправить линии 12 следующим образом:

int pivot = array[lowIndex+((highIndex-lowIndex)/2)]; // our pivot 
          ^    ^

Теперь ваш выход запуска должно быть:

2 45 96 96 96 

Так что теперь что ваше исключение во время выполнения исправлено, вы можете сосредоточиться на своей логике сортировки! ;-)

+0

Альтернативно: 'int pivot = array [(lowIndex + highIndex)/2];' – synchronizer

+0

Решение Java 8: 'Stream.of (2, 45, 96, 1, 16) .sorted(). ForEach (x -> System .out.print (x + "")); –

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