// Program to demonstrate the implementation and usage // of the mergesort algorithm. import java.util.*; public class Sorter { public static void main(String[] args) { Queue list = buildRandom(20); System.out.println(list); mergeSort(list); System.out.println(list); } // creates a queue populated with size random integers // between -99 and 99 public static Queue buildRandom(int size) { Random r = new Random(); Queue queue = new LinkedList(); for (int i = 0; i < size; i++) { queue.add(r.nextInt() % 100); } return queue; } // sorts the queue using the mergesort algorithm // pre: queue != null public static void mergeSort(Queue queue) { if (queue.size() > 1) { // split in half Queue half1 = new LinkedList(); Queue half2 = new LinkedList(); int size = queue.size(); for (int i = 0; i < size / 2; i++) { half1.add(queue.remove()); } while (!queue.isEmpty()) { half2.add(queue.remove()); } // sort the halves mergeSort(half1); mergeSort(half2); // merge back together mergeInto(queue, half1, half2); } } // merges the values in queue1 and queue2 into result // pre: queue1 != null, queue2 != null, result != null // result is empty, queue1 and queue2 are sorted // post: result is sorted, queue1 and queue2 are empty public static void mergeInto(Queue result, Queue queue1, Queue queue2) { while (!queue1.isEmpty() && !queue2.isEmpty()) { if (queue1.peek() <= queue2.peek()) { result.add(queue1.remove()); } else { result.add(queue2.remove()); } } while (!queue1.isEmpty()) { result.add(queue1.remove()); } while (!queue2.isEmpty()) { result.add(queue2.remove()); } } }