合并排序算法-java
我对Java中的MergeSort实现有一个问题。我的代码是这样的,我不知道哪里出错了合并排序算法-java,java,algorithm,sorting,mergesort,Java,Algorithm,Sorting,Mergesort,我对Java中的MergeSort实现有一个问题。我的代码是这样的,我不知道哪里出错了 public List sort(List list) { return mergesort(list, 0, list.size() - 1); } private List mergesort(List list, int startIndex, int endIndex) { if (startIndex == endIndex) {
public List sort(List list) {
return mergesort(list, 0, list.size() - 1);
}
private List mergesort(List list, int startIndex, int endIndex) {
if (startIndex == endIndex) {
List temp = new ArrayList();
temp.add(list.get(0));
return temp;
}
int splitIndex = ((startIndex + endIndex) / 2);
List list1 = mergesort(list, startIndex, splitIndex);
List list2 = mergesort(list, (splitIndex + 1), endIndex);
return merge(list1, list2);
}
private List merge(List left, List right) {
List result = new ArrayList();
ListIterator l = new ListIterator(left);
ListIterator r = new ListIterator(right);
l.first();
r.first();
while (!l.isDone() && !r.isDone()) {
if (comparator.compare(l.current(), r.current()) <= 0) {
result.add(l.current());
l.next();
} else {
result.add(r.current());
r.next();
}
}
while (!l.isDone()) {
result.add(l.current());
l.next();
}
while (!r.isDone()) {
result.add(r.current());
r.next();
}
return result;
}
输出如下所示:
0. Adam, Malysz, 40
1. Adam, Malysz, 40
2. Adam, Malysz, 40
3. Adam, Malysz, 40
4. Adam, Malysz, 40
5. Adam, Malysz, 40
这个街区看起来不对劲
if (startIndex == endIndex) {
List temp = new ArrayList();
temp.add(list.get(0));
return temp;
}
也许,您的意思是
temp.add(list.get(startIndex))代码>?似乎合并函数总是使用相同的最小元素,直到列表为空。这给我的印象是,“ListIterator::current()”和“ListIterator::next()”的使用存在问题
我对列表迭代器不是很精通,所以我的建议是直接对列表进行操作。这还简化了在两个列表中的一个元素用完后添加其余元素的过程:
private List merge(List left, List right) {
List result = new LinkedList();
while (!left.isEmpty() && !right.isEmpty()) {
if (comparator.compare(left.get(0), right.get(0)) <= 0) {
result.add(left.remove(0));
} else {
result.add(right.remove(0));
}
}
// add what is left in the lists
result.addAll(left);
result.addAll(right);
return result;
}
私有列表合并(左列表、右列表){
列表结果=新建LinkedList();
而(!left.isEmpty()&&!right.isEmpty()){
if(comparator.compare(left.get(0),right.get(0))
private List merge(List left, List right) {
List result = new LinkedList();
while (!left.isEmpty() && !right.isEmpty()) {
if (comparator.compare(left.get(0), right.get(0)) <= 0) {
result.add(left.remove(0));
} else {
result.add(right.remove(0));
}
}
// add what is left in the lists
result.addAll(left);
result.addAll(right);
return result;
}