package com.growingwiththeweb.sorting;

import java.util.LinkedList;
import java.util.Queue;

public class MergeSortNatural {
    public static <T extends Comparable<T>> Queue<T> sort(Queue<T> input) {
        Queue<T> output = new LinkedList<T>();
        Queue<T> tempArray1 = new LinkedList<T>();
        Queue<T> tempArray2 = new LinkedList<T>();
        while (input.size() > 0) {
            while (input.size() > 0) {
                merge(input, output, tempArray1);
                merge(input, output, tempArray2);
            }
            while (tempArray1.size() > 0 || tempArray2.size() > 0) {
                merge(tempArray1, tempArray2, output);
                merge(tempArray1, tempArray2, input);
            }
        }
        return output;
    }

    public static <T extends Comparable<T>> void merge(Queue<T> left, Queue<T> right, Queue<T> output) {
        T prevLeft = null;
        T prevRight = null;
        while ((left.size() > 0 && (prevLeft == null || prevLeft.compareTo(left.peek()) <= 0)) ||
               (right.size() > 0 && (prevRight == null || prevRight.compareTo(right.peek()) <= 0))) {

            if (right.size() == 0 || (left.size() > 0 && left.peek().compareTo(right.peek()) <= 0)) {
                prevLeft = left.poll();
                output.add(prevLeft);
            } else {
                prevRight = right.poll();
                output.add(prevRight);
            }
        }
    }
}