2016-05-06 285 views
-1

我試圖通過我的測試儀通過我的快速排序的實施;不過,我得到數組索引-1越界異常對受表彰的線快速排序升序

public void quickSort(ArrayList<String> data, int firstIndex, 
         int numberToSort) { 
    if (data.size() < 16) { 
     insertionSort(data, firstIndex, numberToSort); 
    } else { 
     int index = partition(data, firstIndex, numberToSort); 

     if (firstIndex < index - 1) 
      quickSort(data, firstIndex, index - 1); 
     if (numberToSort > index) 
      quickSort(data, index, numberToSort); 
    } 

} 

@Override 
public int partition(ArrayList<String> data, int firstIndex, 
        int numberToPartition) { 
    String pivot = data.get(firstIndex); 
    int left = data.indexOf(firstIndex); 
    int right = data.indexOf(numberToPartition); 

    while (left <= right) { 
     while (data.get(left).compareTo(pivot) < 0) // this is where I get the error       
      left++; 

     while (data.get(right).compareTo(pivot) > 0) 
      right--; 

     if (left <= right) { 
      temp = data.get(left); 
      Collections.swap(data, left, right); 
      data.set(right, temp); 

      left++; 
      right--; 
     } 
    } 
    return left; 
} 

我試圖調試我的代碼,但似乎我只是不明白的方式來修復錯誤。任何幫助,將不勝感激。

+1

''如果indexOf'''找不到任何東西,則返回-1。 –

+0

顯然'left'是-1 –

+0

看來你正在減少'right'直到'right == - 1',因此'data.get(right)'拋出'java.lang.ArrayIndexOutOfBoundsException:-1' –

回答

1

世界你爲什麼要這麼做

int left = data.indexOf(firstIndex); 
int right = data.indexOf(numberToPartition); 

?該查找List的元素中正在排序的firstIndexnumberToPartition的值。這些數據絕對不可能存在於數據中,即使它們是,也完全是巧合。他們在數據中的指數沒有意義。

倘若那些值中的一個或兩個是未在數據,indexOf()返回-1,其你愉快然後傳遞給List.get()

看起來你想要的東西更像是

int left = firstIndex; 
int right = firstIndex + numberToPartition - 1; 
0

確保firstIndex確確實實發生在data,如果不是.indexOf方法返回-1,你會得到一個java.lang.ArrayIndexOutOfBoundsException: -1int left = data.indexOf(firstIndex);