CSE143X Program Example handout #26
Code for merge sort
-------------------
// post: list is in sorted (nondecreasing) order
public static void sort(Queue list) {
if (list.size() > 1) {
Queue half1 = new LinkedList<>();
Queue half2 = new LinkedList<>();
int size1 = list.size() / 2;
int size2 = list.size() - size1;
for (int i = 0; i < size1; i++) {
half1.add(list.remove());
}
for (int i = 0; i < size2; i++) {
half2.add(list.remove());
}
sort(half1);
sort(half2);
mergeInto(list, half1, half2);
}
}
// pre : result is empty; list1 is sorted; list2 is sorted
// post: result contains the result of merging the sorted lists;
// list1 is empty; list2 is empty
private static void mergeInto(Queue result, Queue list1,
Queue list2) {
while (!list1.isEmpty() && !list2.isEmpty()) {
if (list1.peek().compareTo(list2.peek()) <= 0) {
result.add(list1.remove());
} else {
result.add(list2.remove());
}
}
while (!list1.isEmpty()) {
result.add(list1.remove());
}
while (!list2.isEmpty()) {
result.add(list2.remove());
}
}
Sample Execution on Linux Time-Sharing System (with n = 1 million)
------------------------------------------------------------------
linked list sort took 1.752 seconds
collections sort took 1.043 seconds
Ratio = 1.6797698945349953
lists match and sort is stable