package org.osgl.util.algo; import org.osgl.$; import java.util.Arrays; import java.util.Comparator; /** * Created with IntelliJ IDEA. * User: luog * Date: 12/11/13 * Time: 11:09 PM * To change this template use File | Settings | File Templates. */ public class ArrayMergeSort<T> extends ArraySortBase<T> implements ArraySort<T> { protected T[] sort0(T[] ts, int from, int to, Comparator<T> comp, T[] newTs) { int delta = to - from; if (delta < 30) { ArrayInsertionSort<T> is = Algorithms.arrayInsertionSort(); return is.sort0(ts, from, to, comp, newTs); } Object[] merged = mergeSort(ts, from, to, comp); System.arraycopy(merged, 0, newTs, 0, to - from); return newTs; } static <T> Object[] mergeSort(T[] ts, int from, int to, Comparator<T> comp) { // divide int mid = (from + to) >>> 1; if (mid == from) { return new Object[] {ts[mid]}; } Object[] left = mergeSort(ts, from, mid, comp); Object[] right = mergeSort(ts, mid, to, comp); // merge int llen = left.length; int rlen = right.length; Object[] ret = new Object[llen + rlen]; int l = 0, r = 0; while ((l < llen) && (r < rlen)) { T tl = (T)left[l], tr = (T)right[r]; if (comp.compare(tl, tr) < 0) { ret[l + r] = tl; l++; } else { ret[l + r] = tr; r++; } } if (l < llen) { System.arraycopy(left, l, ret, r + l, llen - l); } else { System.arraycopy(right, r, ret, r + l, rlen - r); } return ret; } public static void main(String[] args) { Integer[] ia = {5, 4, 3, 2, 1}; ArrayMergeSort<Integer> s = new ArrayMergeSort<Integer>(); Integer[] a = s.apply(ia, 0, 5, $.F.NATURAL_ORDER); System.out.println(Arrays.toString(a)); } }