我正在进行插入排序,并且想知道是否正确计算了比较次数和所做的移动次数。比较是两个值进行比较的次数,移动是移动的元素数量,因此数字之间的交换将是2次移动。
public static int[] InsertionSort(int[] a) {
int j;
for(int i = 1; i < a.length; i++) {
int tmp = a[i];
for(j = i; j > 0 && (tmp < a[j-1]); j--) {
numCompares++;
a[j] = a[j-1];
numMoves++;
}
a[j] = tmp;
numMoves++;
}
return a;
}
答案 0 :(得分:2)
这里唯一的问题是在内循环条件j > 0 && (tmp < a[j-1])
中,实际比较tmp < a[j-1]
可能会导致错误,从而导致for
循环中断,因此numCompares++
位于内部循环将被跳过。要精确计算比较,需要进行小型重新格式化:
for(j = i; j > 0; j--) {
numCompares++;
if (tmp >= a[j - 1])
break;
a[j] = a[j - 1];
numMoves++;
}