我正在编写插入排序方法,但我遇到了一些麻烦 -
private int getInsertionPosition(int currPos){
int val = this.toSort.get(currPos);
int index = currPos;
for(int i = 0; i < currPos; i++){
if(val < this.toSort.get(i)){
index = i;
}
}
return index;
}
private void move(int from, int to){
int num = toSort.get(from);
toSort.remove(from);
toSort.add(to, num);
System.out.println("Moved " + from + " to " + to);
}
public void performSort(){
for(int i = 1; i < original.length; i++){
move(i,getInsertionPosition(i));
System.out.println(this.toSort.toString());
}
}
我在那里有几个调试行,打印出从/到移动arraylist的元素的索引。
但是,我得到了奇怪的操作,有时它会将看似任意的值移动到错误的索引,即
” [7,18,29,3,2,4,24,18,18,13] 移动3到2 [7,18,3,29,2,4,24,18,18,13] “
有任何帮助吗?我99%肯定问题出在getInsertionPosition方法上。
答案 0 :(得分:0)
是的,您的问题出在getInsertionPoint
。您需要返回值大于该值的第一个索引。目前,您返回的最后一个索引大于该值。
尝试:
private int getInsertionPosition(int currPos) {
for (int i = 0; i < currPos; i++) {
if (toSort.get(currPos) < this.toSort.get(i)) {
return i;
}
}
return currPos;
}
或者,如果您熟悉Java 8流:
return IntStream.range(0, currPos)
.filter(i -> toSort.get(currPos) < toSort.get(i))
.findFirst().orElse(currPos);