/**
* Sort the elements of list L in nondecreasing order according
* to comparator c, using the merge-sort algorithm.
**/
public static void mergeSort (List L, Comparator c) {
int n = L.size();
if (n < 2)
return; // the list L is already sorted in this case
// divide
List L1 = new NodeList(); // first list used in recursion
List L2 = new NodeList(); // second list used in recursion
int i = 0;
while (i < n/2) {
L1.insertLast(L.remove(L.first())); // move the first n/2 elements to L1
i++;
}
while (!L.isEmpty())
L2.insertLast(L.remove(L.first())); // move the rest to L2
// recurse
mergeSort(L1,c);
mergeSort(L2,c);
//conquer
merge(L1,L2,c,L);
}