package me.ramswaroop.linkedlists;
import me.ramswaroop.common.SingleLinkedList;
import me.ramswaroop.common.SingleLinkedNode;
/**
* Created by IntelliJ IDEA.
*
* @author: ramswaroop
* @date: 7/21/15
* @time: 11:43 PM
*/
public class QuickSort {
public static <E extends Comparable<E>> SingleLinkedNode<E>[] partition(SingleLinkedNode<E> firstNode,
SingleLinkedNode<E> lastNode) {
SingleLinkedNode<E>[] partition = new SingleLinkedNode[4];
SingleLinkedNode<E> pivot = lastNode, curr = new SingleLinkedNode<>(null, firstNode), currNext, pivotNext;
while (curr.next != null && curr.next != lastNode) {
if (curr.next.item.compareTo(pivot.item) > 0) {
currNext = curr.next;
curr.next = currNext.next;
pivotNext = pivot.next;
pivot.next = currNext;
currNext.next = pivotNext;
continue;
}
curr = curr.next;
}
partition[0] = curr;
while (curr.next != pivot) {
curr = curr.next;
}
partition[1] = curr;
partition[2] = pivot.next;
while (curr.next != null) {
curr = curr.next;
}
partition[3] = curr;
return partition;
}
public static <E extends Comparable<E>> SingleLinkedNode<E> quickSort(SingleLinkedNode<E> firstNode,
SingleLinkedNode<E> lastNode) {
SingleLinkedNode<E> head = firstNode;
if (firstNode != lastNode) {
SingleLinkedNode<E> partition[] = partition(firstNode, lastNode);
head = quickSort(partition[0], partition[1]);
quickSort(partition[2], partition[3]);
}
return head;
}
public static <E extends Comparable<E>> SingleLinkedNode<E> quickSort(SingleLinkedNode<E> node) {
return quickSort(node, getLastNode(node));
}
public static <E extends Comparable<E>> SingleLinkedNode<E> getLastNode(SingleLinkedNode<E> node) {
SingleLinkedNode<E> curr = node;
while (curr != null && curr.next != null) {
curr = curr.next;
}
return curr;
}
public static void main(String a[]) {
SingleLinkedList<Integer> linkedList = new SingleLinkedList<>();
linkedList.add(23);
linkedList.add(4);
linkedList.add(45);
linkedList.add(11);
linkedList.add(7);
linkedList.printList();
linkedList.printList(quickSort(linkedList.head));
}
}