package com.interview.basics.sort;
/**
* Created with IntelliJ IDEA.
* User: stefanie
* Date: 10/17/14
* Time: 2:30 PM
*/
public class MergeSorterKWay<T extends Comparable<T>> extends Sorter<T> {
public int k;
public MergeSorterKWay(int k){
this.k = k;
}
@Override
public T[] sort(T[] input) {
int N = input.length;
T[] aux = (T[]) new Comparable[N];
sort(input, aux, 0, N-1);
return input;
}
protected void sort(T[] input, T[] aux, int low, int high){
if(high <= low) return;
int step = 1;
if(high - low + 1 > k){
step = (high - low + 1) / k;
for(int i = 0; i < k; i++){
sort(input, aux, low + i * step, i == k - 1? high : low + (i + 1) * step - 1);
}
}
merge(input, aux, low, high, step);
}
protected void merge(T[] input, T[] aux, int low, int high, int step) {
for(int i = low; i <= high; i++) aux[i] = input[i];
int[] offsets = new int[k];
for(int i = 0; i < k; i++) offsets[i] = low + i * step;
for(int j = low; j <= high; j++){
int offset = -1;
int min = -1;
for(int i = 0; i < k; i++){
int top = low + (i + 1) * step - 1;
if(offsets[i] <= (i == k - 1 || top > high ? high : top)
&& (min == -1 || aux[offsets[i]].compareTo(aux[min]) < 0)){
min = offsets[i];
offset = i;
}
}
input[j] = aux[min];
offsets[offset]++;
}
}
}