1

Apologies upfront, this is my first time posting, and I'm new to programming. Right now I am writing a program that times how long it takes for a selective sort algorithm to finish sorting. The code takes user input for how many integers are in the array and for how many iterations the for loop will go through before stopping, but i have run into two bugs.

First, the output of the timer I have set in keeps outputting 0. Second, I am a little confused on how to implement how many times i want the for loop to run.

I have managed to run my code without errors, including what I think I should do about setting the number of iterations, but without me being able to see the correct output on the timer, I cannot tell if i am correct.

Here is the code. I have been using 10 for both inputs, being the array size and the number of iterations, though changing both numbers hasn't yielded any results yet for me.

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

public class SelectionTimed
{
   public static void main(String [] args)
   {
  //asks user how many integers in the array
  System.out.println("Please enter the number of integers to be created in the array: ");   
  Scanner scan = new Scanner (System.in);
  int nums = scan.nextInt();//scans for user input

  //asks user how many times to perform for loop
  System.out.println("Please enter how many iterations you would like the algorithm to perform.");
  int turns = scan.nextInt();//scans for user imput

  int limit = 100;//max for integer generator
  int [] array = new int[nums];//makes array, sets index to user input

  Random generator = new Random();

  //fills array with random integers
  for (int i=0; i<nums; i++)
     {
        array[i] = generator.nextInt(limit);
     }      

  //prints off the array before sort
  System.out.println("Before sort:");
  System.out.println(Arrays.toString(array));

  //Begin timer   
  long startTime = System.nanoTime();

  //selection sort algorithm
  int min;
  for (int i = 0; i < turns; i++) 
  {
     min = i;
     for (int j = i + 1; j < array.length; j++)
     {
        if (array[j] < array[min]) 
        {
           min = j;
        }
     }
  if (min != i)
  {
     int temp = array[i];
     array[i] = array[min];
     array[min] = temp;
  }
  }

  //End timer
  long endTime = System.nanoTime();

  long timeDiff = (endTime - startTime);
  long duration = (timeDiff/1000000L);

  //prints array after sort
  System.out.println("After sort:");
  System.out.println(Arrays.toString(array));
  System.out.println("Duration of sort:");
  System.out.println(duration);
  }
  }

Now when it comes to printing the long variable "duration" i have tried different iterations of what is similar to printing the arrays

System.out.println(Long.toString(duration);

but that doesnt change the output from being zero. Though when i tried just printing "timeDiff" without dividing, it gives me a four digit integer.

It will also need to print the number of iterations and the number of items sorted but i will work those in later.

Again I apologise if the post is formatted wrong, but I would appreciate any input you all have.

Wil
  • 131
  • 1
  • 2
  • 9
  • The computer is too fast: trying to time it like this is pointless. (There are also other reasons why such timings would be suspect; search for 'Java benchmark'.) – user2864740 Jul 01 '15 at 02:59
  • Anyway, for the *actual* problem of "0" as the result is 'integer division' (look that up too) and then saving the seconds as an integer type. Try a double with floating division, eg. `double durationSeconds = timeDiff / 1000000d;` (note: ones less 0, floating point division forced, saving result to double variable) which will yield a *very small* but non-0 number. – user2864740 Jul 01 '15 at 03:01
  • I cheat and use either JodaTime or Java's Time API, both have the capablities to calculate durations – MadProgrammer Jul 01 '15 at 03:19

1 Answers1

2

The duration could be stored as a double:

Random random = new Random();
int [] array = new int[100000];

for (int i = 0; i < array.length; i++) {
  array[i] = random.nextInt(1000);
}

//Begin timer
long startTime = System.nanoTime();

for (int i = 0; i < array.length; i++) {
  int min = i;
  for (int j = i + 1; j < array.length; j++) {
    if (array[j] < array[min]) {
      min = j;
    }
  }
  if (min != i) {
    int temp = array[i];
    array[i] = array[min];
    array[min] = temp;
  }
}

//End timer
long endTime = System.nanoTime();

long timeDiff = (endTime - startTime);
double duration = (timeDiff/1000000.0);

System.out.println("Duration of sort (nanoseconds):");
System.out.println(timeDiff);
System.out.println("Duration of sort (milliseconds):");
System.out.printf("%.6f", duration);

Duration of sort (nanoseconds):
7354061110
Duration of sort (milliseconds):
7354.061110
dting
  • 38,604
  • 10
  • 95
  • 114