Tuesday, August 14, 2012

Java Generic Merge Sort - Top Down Approach

Reference : http://en.wikipedia.org/wiki/Merge_sort
package sorting; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.LinkedList; import java.util.Queue; public class MergeSort { private Object[] data = null; private Comparator<Object> comparator = null; public MergeSort(Object[] data, Comparator<Object> comparator){ this.data = data; this.comparator = comparator; } public Object[] sort(){ return sort(data); } private Object[] sort(Object[] data) { if(data==null || data.length<2) return data; //divide into two sublist till it has only one element int middle = data.length/2; Object[] first = Arrays.copyOfRange(data, 0, middle); Object[] second = Arrays.copyOfRange(data, middle, data.length); //merge two list into one and do this recursively till you get one list. return merge(sort(first), sort(second)); } private Object[] merge(Object[] first, Object[] second) { ArrayList<Object> result = new ArrayList<Object>(); Queue<Object> firstQueue = new LinkedList<Object>(); for(Object o:first) firstQueue.add(o); Queue<Object> secondQueue = new LinkedList<Object>(); for(Object o:second) secondQueue.add(o); while(firstQueue.size()>0 || secondQueue.size()>0){ if(firstQueue.size()>0 && secondQueue.size()>0){ if(comparator.compare(firstQueue.peek(),secondQueue.peek())<=0){ result.add(firstQueue.remove()); }else{ result.add(secondQueue.remove()); } }else if(firstQueue.size()>0){ result.add(firstQueue.remove()); }else{ result.add(secondQueue.remove()); } } return result.toArray(); } }

No comments:

Post a Comment