插入排序代码问题

时间:2017-04-06 00:49:35

标签: java sorting

我正在编写插入排序方法,但我遇到了一些麻烦 -

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方法上。

1 个答案:

答案 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);