2015-03-19 81 views
0

我设法翻译鸡尾酒排序方法的伪代码,但是当我运行它,我得到一个运行时错误显示这样的:我的鸡尾酒排序代码有什么问题?

java.lang.ArrayIndexOutOfBoundsException: 1 
    at Sorting.cocktailSort(Sorting.java:119) 
    at Sorting.plotCocktailSortTest(Sorting.java:213) 
    at Sorting.main(Sorting.java:19) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272) 

这里是我的这种排序方法的代码:

public static int cocktailSort(String[] numbers) { 
    String [] inputCocktail = new String [numbers.length]; 
    for(int a = 0; a < numbers.length-2; a++) { 
     inputCocktail[a] = numbers [a]; 
    }  
    int left = 0; 
    int right = numbers.length; 
    boolean swapped =true; 
    String temp = ""; 
    int counter = 0; 
    while (left < right && swapped) { 
     swapped =false; 
     for (int mid = 0; mid < numbers.length; mid++) { 
      if ((inputCocktail[mid].compareTo(inputCocktail[mid+1]))>0) 
      { temp = inputCocktail[mid]; 
       inputCocktail[mid] = inputCocktail[mid+1]; 
       inputCocktail[mid+1] = temp; 
       swapped = true; 
      } 
     }  
     right--; 
     if (swapped){ 
      swapped = false; 
      for(int mid = numbers.length-2; mid>0; mid--) 
       if ((inputCocktail[mid].compareTo(inputCocktail[mid-1]))<0) 
       { temp = inputCocktail[mid]; 
        inputCocktail[mid]= inputCocktail[mid-1]; 
        inputCocktail[mid-1] = temp; 
        swapped = true; 
       } 
     }  
    }  
    left++; 
    counter++; 
    return counter; 
}  

我不管我多次查看我的代码,都无法找到我的错误。 任何帮助,将不胜感激。谢谢。

编辑:

public static int compare(String a, String b) 
     { 
    int compared = 0; 
    a = a.toLowerCase(); 
    b = b.toLowerCase(); 
    //program assumes strings are equal 

    for (int i = 0; i<a.length() && i<a.length(); i++){ 
     //for() loop goes on until the largest string 
     int c = a.charAt(i); 
     int d = b.charAt(i); 
     //convert char into int for comparison just in case 
     if(c < d){ 
      compared = -1; 
      break; 
      //breaks at the first occurence of non equal characters 
     } 
     else if(c > d){ 
      compared = 1; 
      break; 
      //same as above 
     } 
    } 

    return compared; 
    } 

编辑#2:

public static void plotCocktailSortTest(int N_MAX) { 
    int[] cocktail_sort_results = new int[N_MAX]; 

// test sorting for arrays from size 1 to N_MAX 
    // MAKE SURE THAT YOUR METHOD IS ACTUALLY SORTING THE TEST ARRAY!!!!!! 
    for (int i = 1; i < N_MAX; i++) { 
     String[] test_array = ArrayUtilities.getRandomNamesArray(i); 
     cocktail_sort_results[i] = cocktailSort(test_array); 
    } 
    // create a plot window 
    PlotWindow pw = new PlotWindow("Cocktail Sort!"); 
    // add a plot to the window using our results array 
    pw.addPlot("CocktailSort", cocktail_sort_results); 
    } 
+3

我建议你寻找最短的数据集,它会触发这个错误,并在调试器中执行代码。 – 2015-03-19 01:30:17

回答

2

这看起来错

for (int mid = 0; mid < numbers.length; mid++) { 
     if ((inputCocktail[mid].compareTo(inputCocktail[mid+1]))>0) 

如以前你只用填充inputCocktail 首先是比较字符串的方法元素高达numbers.length - 2

根据您的新发布的代码

for (int i = 1; i < N_MAX; i++) { 
     String[] test_array = ArrayUtilities.getRandomNamesArray(i); 

我不知道什么ArrayUtilities是,但也许getRandomNamesArray(1)将返回大小1

阵列在你以后的代码,您试图访问数组基于size - 2size + 1,这显然会失败。

+0

我将其更改为numbers.length - 2,但仍然给了我相同的错误。 – ak32 2015-03-19 01:39:03

+0

你是怎么调用这段代码的。 – 2015-03-19 01:40:03

+0

整个代码被称为排序 – ak32 2015-03-19 01:44:32