private void merge(int[] array, int low, int mid, int hight) {
if (low >= hight) {
return;
}
int[] auxArray = new int[hight - low + 1];
int index1 = low;
int index2 = mid + 1;
int i = 0;
while(index1 <= mid && index2 <= hight) {
if (array[index1] <= array[index2]) {
auxArray[i] = array[index1];
index1++;
i++;
} else {
auxArray[i] = array[index2];
index2++;
i++;
}
}
while (index1 <= mid) {
auxArray[i] = array[index1];
index1++;
i++;
}
while (index2 <= hight) {
auxArray[i] = array[index2];
index2++;
i++;
}
for (int j = 0; j < auxArray.length; j++) {
array[low + j] = auxArray[j];
}
}
int groupSize = 1;
while(groupSize < length) {
for (int i = 0; i < length; i += (groupSize * 2)) {
int low = i;
int hight = Math.min(i + groupSize * 2 - 1, length - 1);
int middle = low + groupSize - 1;
merge(array, low, middle >= hight ? (low + hight) / 2 : middle, hight);
}
groupSize *= 2;
}