计算排序期间进行的比较和移动次数

时间:2015-05-06 18:17:58

标签: java sorting insertion-sort

我正在进行插入排序,并且想知道是否正确计算了比较次数和所做的移动次数。比较是两个值进行比较的次数,移动是移动的元素数量,因此数字之间的交换将是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;
}

1 个答案:

答案 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++;
}