【问题标题】:Java Bubble sort Algorithm timer issuesJava 冒泡排序算法定时器问题
【发布时间】:2014-01-16 05:20:58
【问题描述】:

我正在尝试使用计数器和计时器检查此 java 冒泡排序算法的效率。计数器工作正常,但计时器似乎考虑了用户输入要排序的数字集需要多长时间。我只希望计时器计时冒泡排序算法需要多长时间进行排序。任何提示或帮助将不胜感激:)

public class bubsort {

public static void main(String[] args) {
    int n, c, d, swap;
    Long startTimer;
    Scanner in = new Scanner(System.in);

    System.out.println("Input number of integers to sort");
    n = in.nextInt();

    int array[] = new int[n];
    int counter = 0;

    System.out.println("Enter " + n + " integers");

    for (c = 0; c < n; c++) {
        array[c] = in.nextInt();
    }

   startTimer = System.nanoTime();

    for (c = 0; c < (n - 1); c++) {

        for (d = 0; d < n - c - 1; d++) {
            counter++;
            if (array[d] > array[d + 1]) {
                swap = array[d];
                array[d] = array[d + 1];
                array[d + 1] = swap;

            }
        }
    }
    System.out.println(System.nanoTime() - startTimer + "ms");

            System.out.println("Sorted list of numbers");

    for (c = 0; c < n; c++) {
        System.out.println(array[c]);
    }
    System.out.println("Counter: " + counter);

【问题讨论】:

  • 纳秒!= 毫秒。此外,System.nanoTime() 与挂钟时间无关。不要期望得到准确的结果。
  • @ElliottFrisch 您所说的“不要期望得到准确的结果”是什么意思? OP 正在测量 duration,这是 nanoTime 的精确用例。
  • @MarkoTopolnik 我的意思是 - 不要指望精确和准确的纳秒计数。请参阅JavaDoc 中的这一行 - “此方法提供纳秒精度,但不一定提供纳秒分辨率(即值更改的频率) - 除了分辨率至少与 currentTimeMillis 一样好( )"
  • 鉴于StartTimer 是在循环范围内声明的,因此无法编译。你确定这就是你的代码吗? PS:为了所有神圣的事物的爱,不要以大写开头的变量名
  • 这实际上编译得很好,因为我使用的是全局变量,是的,我同意我不应该使用大写的变量名,但现在我更关心代码的准确输出:)

标签: java algorithm sorting timer


【解决方案1】:

将 startTimer 移动到嵌套循环之前,但在输入循环之后。然后回想一下 nanoTime 给出的是 ns 而不是 ms。如果你想要毫秒使用 System.currentTimeMillis()。

【讨论】:

  • 嗨,Teresa,我已将开始计时器移至您建议的位置,这是我在原始帖子中将其注释掉的位置,但仍然存在同样的问题。但我想知道我是否以错误的方式对其进行编码。例如,如果我按 3 4 1 2 的顺序对 4 个数字进行排序,我希望每次运行程序时计时器的输出应该是相同的,还是我使用了错误的计时器?谢谢
  • 时代有何不同?您测量的是 纳秒,因此您不能期望它们每次都完全相同。
  • 变化我一直使用 4 个整数 3 4 1 和 2。时间从 245169 ns 变化到 376517ns,这就是为什么我觉得时间不一致。为了测试,我花了一些时间来输入需要排序的数字等。但是到目前为止给出的代码和建议对我来说看起来不错。
  • 请记住,您的 CPU 也在做其他事情。更好的测试会随机或顺序生成数千个整数的列表,然后将它们打乱。测试几次并比较,然后增加列表的大小并再次测试。它是否增加了您所期望的方式?
  • 谢谢 Teresa,我同意,但是我选择不生成随机数,这样我就可以进行更可控的实验来创建自己的测试数据。我只是不完全理解 nanoTime 和 currentTimeMillis 是如何实际工作的,假设每次我的结果应该是相同的。但答案已经为我澄清了这一点。谢谢。
猜你喜欢
  • 2013-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
  • 2023-03-07
  • 1970-01-01
  • 2016-03-19
  • 1970-01-01
相关资源
最近更新 更多