/* * Java program to test/time quicksort. * * sequential version. * * command-line arguments: number of elements to sort, seed for RNG. */ package csci3366.hw4; import java.util.Random; public class QuickSortSeq { /* main method */ public static void main(String[] args) { String usageMsg = "arguments are numElements seed"; /* process command-line arguments */ if (args.length < 2) { System.err.println(usageMsg); System.exit(1); } int n = 0; int seed = 0; try { n = Integer.parseInt(args[0]); seed = Integer.parseInt(args[1]); } catch (NumberFormatException e) { System.err.println("arguments must be integers"); System.exit(1); } /* generate data */ Integer[] ints = new Integer[n]; Random randGen = new Random((long) seed); for (int i = 0; i < ints.length; ++i) { ints[i] = new Integer(randGen.nextInt()); } /* sort (time this part only) */ long startTime = System.currentTimeMillis(); sort(ints); long endTime = System.currentTimeMillis(); /* check whether sort succeeded */ if (isSorted(ints)) { System.out.println("sort succeeded"); } else { System.out.println("sort failed"); } /* print timing result */ System.out.println("Sequential program"); System.out.println("Time for sort of " + n + " random integers (seed " + seed + ") is " + ((double) (endTime - startTime) / 1000) + " seconds"); } /* check whether array is sorted */ public static boolean isSorted(Integer[] data) { for (int i = 0; i < data.length-1; ++i) { if (data[i].compareTo(data[i+1]) > 0) return false; } return true; } /* main quicksort routine */ public static void sort(Integer[] data) { sort(data, 0, data.length-1); } /* * recursive quicksort: * sorts data[firstIndex..lastIndex] in place */ private static void sort(Integer[] data, int startIndex, int endIndex) { if (startIndex < endIndex) { int splitIndex = partition(data, startIndex, endIndex); sort(data, startIndex, splitIndex-1); sort(data, splitIndex+1, endIndex); } } /* * rearranges array elements from startIndex through endIndex such that * elements <= pivot are to the left of splitIndex and elements > pivot * are to the right of splitIndex, places pivot at splitIndex, and * returns splitIndex. */ private static int partition(Integer[] data, int startIndex, int endIndex) { int k = startIndex + 1; int m = startIndex + 1; /* * loop invariant: * data[startIndex .. k-1] <= data[startIndex] * data[k .. m-1] > data[startIndex] */ while (m <= endIndex) { if (data[m].compareTo(data[startIndex]) > 0) { } else { swap(data, k, m); ++k; } ++m; } swap(data, startIndex, k-1); return k-1; } /* swaps array elements */ private static void swap(Integer[] data, int i, int j) { Integer temp = data[i]; data[i] = data[j]; data[j] = temp; } }