import java.util.Arrays; import java.util.Random; import java.util.Scanner; public class Search { private static int NUM_SAMPLES = 1000; public static void main(String[] args) { Scanner console = new Scanner(System.in); System.out.print("How many numbers do you want to use? "); int n = console.nextInt(); // warm-up for (int i = 0; i < 100; i++) { linearSearch(new int[3*n], 1); } // run the three timed tests double time1 = test(n); double time2 = test(2 * n); double time3 = test(3 * n); System.out.println("Double/single ratio = " + time2 / time1); System.out.println("Triple/single ratio = " + time3 / time1); } public static double test(int n) { int[] nums = generateArray(n); Arrays.sort(nums); double sum = 0; for (int i = 0; i < NUM_SAMPLES; i++) { long startTime = System.nanoTime(); linearSearch(nums, 1); sum += System.nanoTime() - startTime; } double elapsed = sum / NUM_SAMPLES; // report and return results System.out.println("for n = " + n + ", time = " + elapsed); System.out.println(); return elapsed; } public static int binarySearch(int[] nums, int value) { return binarySearch(nums, value, 0, nums.length - 1); } private static int binarySearch(int[] nums, int value, int min, int max) { if (min > max) { return -1; } int mid = (min + max) / 2; if (nums[mid] == value) { return mid; } else if (nums[mid] > value) { return binarySearch(nums, value, min, mid - 1); } else { // nums[mid] < value return binarySearch(nums, value, mid + 1, max); } } public static int linearSearch(int[] nums, int value) { for (int i = 0; i < nums.length; i++) { if (nums[i] == value) { return i; } } return -1; } public static int[] generateArray(int n) { Random rand = new Random(); int[] nums = new int[n]; for (int i = 0; i < n; i++) { nums[i] = rand.nextInt() % (n * 10); } return nums; } }