java - 计算排序过程中进行比较和移动的次数

标签 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;
}

最佳答案

这里唯一的问题是在内循环条件下j > 0 && (tmp < a[j-1]) ,实际对比tmp < a[j-1]可能结果为 false,导致 for 中断循环,所以numCompares++位于循环内部的内容将被跳过。为了精确地计算比较,需要进行小的重新格式化:

for(j = i; j > 0; j--) {
    numCompares++; 
    if (tmp >= a[j - 1])
        break; 
    a[j] = a[j - 1];
    numMoves++;
}

关于java - 计算排序过程中进行比较和移动的次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30084602/

相关文章:

sorting - Thrust::sort 有多快以及最快的基数排序实现是什么

c - 插入排序给出了奇怪的输出

java - 无法解析符号 'R'

c++ - 创建 C++ vector 的排序拷贝的最高效方法是什么?

java - SWT:用组件重新填充外壳时布局被破坏

java - 在java中对数字字符串间隔进行排序

Java 字符串数组插入排序

c - 获取数组中的元素数量未按预期工作

java - 无法容纳元素

java - 从多个源 DTO 映射到一个目标