定时 Java 气泡排序算法



我必须对各种大小的数组进行排序,每次排序的时间。我的计时器给我的时间很短,以纳秒为单位,但主要是零。我已经将点更改为开始和结束计时器,试图解决问题,但没有成功。有人可以告诉我我的计时器问题是什么吗?

import java.util.Random;
import java.util.Scanner;

public class BubbleSort
{
   public static void main(String[] args) {
      Random rand = new Random();
      Scanner input = new Scanner(System.in);
  int m;
  int n = 0;
  int num_i = 0;
  long startTime = System.nanoTime(); 
  long running_time;
  int temp;
  System.out.print("Input array size: ");
  n = input.nextInt();
  System.out.print("Input number of arrays: ");
  num_i = input.nextInt();
  for(int j =  0; j < num_i; j++){

  }
  int array[] = new int [n];

  for(int i = 0; i < n; i++)
  {
      for( m = 0; m < array.length; m++){
      array[m] = (int)(Math.random()*100);
      }
     //int[] sorted = new int[n];
     for (int k = 0; k < array.length; k++) {
        for (int j = 1; j < (array.length - k); j++) {

          //System.out.println("Start Time: " + startTime);
              startTime =System.nanoTime();
           if (array[j - 1] > array[j]) {
              temp = array[j - 1];
              array[j - 1] = array[j];
              array[j] = temp;
           }
           long endTime = System.nanoTime(); 
           running_time = endTime - startTime;
         // System.out.println("End Time: " + endTime);
          System.out.println(running_time);
        }

     }
  }
   }
}

一个问题是代码只测试 if 和交换代码所需的时间,而不是整个气泡排序。我制作了一个简化版本,大约需要一秒钟来对 30,000 个数字进行排序。

在大多数系统上,计时器的频率不是纳秒,具体取决于计算机和操作系统。在我的系统上,英特尔 3770K 3.5 GHz,在 Windows 7 64 位模式下,计时器以 3.410312 MHz 运行,或每个"滴答"约 293.2283 纳秒。在Windows XP下,计时器的运行频率约为3.5GHz,或每"滴答"约0.2857纳秒,但如今这种情况可能很少见。

如果测试导致运行时间为零,请使用更大的阵列进行测试。可以多次重复测试,但缓存来自多次运行的数据会影响结果。

    public static void main (String args[])
    {
        Random rand = new Random();
        int m;
        long startTime;
        long endTime; 
        long running_time;
        int temp;
        int n = 30000;     // set to value rather than input from user
        int array[] = new int [n];
        for( m = 0; m < array.length; m++){
            array[m] = (int)(Math.random()*100);
        }
        // benchmark sort time
        startTime =System.nanoTime();
        for (int k = 0; k < array.length; k++) {
            for (int j = 1; j < (array.length - k); j++) {
                if (array[j - 1] > array[j]) {
                    temp = array[j - 1];
                    array[j - 1] = array[j];
                    array[j] = temp;
                }
            }
        }
        endTime = System.nanoTime(); 
        running_time = endTime - startTime;
        System.out.println(running_time);
    }
}

最新更新