/**
* , , 。
* ,
* O(nlogn)
* O(n) n
* :
* ,, 。
* , 。
* , 。
*
*/
public class MergeSort {
public void sort(int[] arr){
sort(arr, 0, arr.length - 1);
}
private void sort(int[] arr, int start, int end){
if(start >= end){
return;
}
int middle = (start + end) / 2;
sort(arr, start, middle);
sort(arr, middle + 1, end);
merge(arr, start, middle, end);
}
/**
*
* @param arr
* @param start
* @param middle ,middle+1
* @param end
*/
private void merge(int[] arr, int start, int middle, int end){
//
int tmplen = end - start + 1;
//
int[] tmp = new int[tmplen];
//
int left = start;
//
int right = middle + 1;
//tmp
int i = 0;
while(left <= middle && right <= end){
if(arr[left] < arr[right]){
tmp[i] = arr[left];
left++;
}else{
tmp[i] = arr[right];
right++;
}
i++;
}
while(left <= middle){
tmp[i] = arr[left];
left++;
i++;
}
while(right <= end){
tmp[i] = arr[right];
right++;
i++;
}
for(i = 0; i < tmplen; i++){
arr[start + i] = tmp[i];
}
}
}