计算排序过程中进行的比较和移动的次数
Counting the number of comparisons and moves made during sorting
我正在做插入排序,想知道比较次数和移动次数是否计算正确。比较是比较两个值的次数,移动是移动元素的数量,因此数字之间的交换将是 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;
}
这里唯一的问题是在内部循环条件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++;
}
我正在做插入排序,想知道比较次数和移动次数是否计算正确。比较是比较两个值的次数,移动是移动元素的数量,因此数字之间的交换将是 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;
}
这里唯一的问题是在内部循环条件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++;
}