【发布时间】:2016-10-10 05:29:38
【问题描述】:
所以我现在正在学习 MergeSort 来解决 Project Euler 上的一个问题。
我正在尝试按字母顺序对列表 5163 个名称进行排序。我做了一些研究,发现 MergeSort 将是一种相当有效的方法。
所以我根据link 编写了一个实现。
下面是我的mergeSort 和merge 方法。
public static List<String> mergeSort(List<String> list){
if (list.size() == 1){ //if fully divided
return list;
}
List<String> leftSide = list.subList(0, list.size()/2);
List<String> rightSide = list.subList(list.size()/2 + 1, list.size());
leftSide = mergeSort(leftSide);
rightSide = mergeSort(rightSide);
return merge(leftSide, rightSide);
}
public static List<String> merge(List<String> listA, List<String> listB){
List<String> listC = new LinkedList<String>();
while (!listA.isEmpty() & !listB.isEmpty()){ //while both have elements
if (listA.get(0).compareTo(listB.get(0)) > 1){ //if stringA is greater than stringB
listC.add(listA.get(0));
listA.remove(0);
} else { //if stringB is greater than stringA
listC.add(listB.get(0));
listB.remove(0);
}
}
while (!listA.isEmpty()){ //while listA has elements
listC.add(listA.get(0));
listA.remove(0);
}
while (!listB.isEmpty()){ //while listB has elements
listC.add(listB.get(0));
listB.remove(0);
}
return listC;
}
问题是,当我尝试将mergeSort 方法与我的姓名列表一起使用时,它给了我以下错误:
线程“main”中的异常 java.lang.IllegalArgumentException: fromIndex(1) > toIndex(0)
哪个指向这条线:
List<String> rightSide = list.subList(list.size()/2 + 1, list.size());
我真的不明白为什么会这样。在我看来,我使用的方法与教程中显示的完全相同。
此外,据我了解,此错误告诉我列表的大小为零。这将是list.size()/2 + 1 可以等于一而list.size() 可以等于零的唯一方式。但是,我不明白为什么我的列表可能为零。因为它要被分割,直到大小为1,然后它会被退回。
我可以看到它等于零的唯一方法是它是否从零开始,但我已经确认我的list.size() 是从 5163 开始的。
有人可以帮我指出我做错了什么吗?我确信这很简单,但由于我刚刚开始学习这个,我不确定它是什么。
编辑:
我在这里查看列表的大小:
System.out.println(namesArray.size()); //prints "5163"
namesArray = mergeSort(namesArray);
那么我的列表怎么可能是零大小的呢?
【问题讨论】:
标签: java algorithm sorting mergesort