插入排序对象,字符串和Arraylists

时间:2014-10-06 21:32:56

标签: java sorting arraylist insertion-sort

我的插入排序代码出错了。

public static ArrayList InsertionSort(ArrayList playersNames){

    System.out.println("roster will now be sorted");

    for (int i = 1; i < playersNames.size();i++){

        int j = i - 1;
         Baller tempx = playersNames.get(i);
         Baller tempy = playersNames.get(j);
         while (j >= 0 &&  tempx.getName().compareToIgnoreCase(tempy.getName())< 0){
            playersNames.set(i, tempy);
            playersNames.set(j+1, tempx);
            j--;

         }


        System.out.println(playersNames);
    }

    return playersNames;
}

输出没有正确输出。

1 个答案:

答案 0 :(得分:0)

我认为您需要对代码进行一些小的更改,以解决您遇到的问题。

让我们看一下代码的这一部分:

     int j = i - 1;
     Baller tempx = playersNames.get(i);
     Baller tempy = playersNames.get(j);
     while (j >= 0 &&  tempx.getName().compareToIgnoreCase(tempy.getName())< 0){
        playersNames.set(i, tempy);
        playersNames.set(j+1, tempx);
        j--;

     }

这里的想法是重复地将当前元素与前一个元素交换,直到它最终到达正确的位置。这是一个正确的想法,但是有一个小错误:在你进行交换之后,tempy仍然引用位于playersNames.get(i - 1)位置的元素,因此下一次迭代循环将比较错误的两个元素。此外,您始终在位置i(当前元素开始的位置)执行交换,但您应该在位置j+1(当前元素位于此处)进行交换。

要更改此设置,您有几个选择。我认为最干净的选择是消除tempxtempy变量,以确保您不会意外地犯这个错误,而只是通过索引访问事物。例如:

     int j = i - 1;
     while (j >= 0 &&
            playersNames.get(j).getName().compareToIgnoreCase(playersNames.get(j+1).getName().getName()) < 0){
        Baller temp = playersNames.get(j);
        playersNames.set(j, playersNames.get(j+1));
        playersNames.set(j+1, temp);
        j--;
     }