利用归并的思想方法实现排序。
- 假设数组长度为n, 则数组可以看成n个有序的子序列,每个元素的子序列长度为1;
- 然后从下标为0到最后一个元素每两个元素排序,两两归并,则得到n/ 2个长度为2或1的有序子序列;
- 然后从左至右将每两个有序子序列里面的元素排序好,再次两两归并,得到n / 4个有序子序列;
- 重复上述步骤,直至得到一个长度为n的有序序列为止;这种方法称为2路归并排序
public class MergeSort {
/**
*
* @param array 要排序的数组
* @param start 第一个元素的索引
* @param end 最后一个元素的的索引
*/
public void mergeSort(int[] array, int start, int end) {
if (start < end) {
int middle = (start + end) / 2;
mergeSort(array, start, middle);
mergeSort(array, middle + 1, end);
merge(array, start, middle, end);
}
}
/**
* 将array[start] ~ array[middle] 以及 array[middle+1] ~ array[end]两个
* 有序子序列归并为一个有序子序列array[start] ~ array[end]
* @param array
* @param start
* @param middle
* @param end
*/
private void merge(int array[], int start, int middle, int end) {
int[] tmp = new int[end-start+1];
int i = start, j = middle + 1, k = 0;
// 分别将两段数组的值按从小到大的顺序复制到tmp数组中;
for (; i <= middle && j <= end; k++) {
if (array[i] < array[j]) {
tmp[k] = array[i++];
} else {
tmp[k] = array[j++];
}
}
// 将前半数组剩余的值复制
while(i <= middle) {
tmp[k++] = array[i++];
}
// 将后半数组剩余的值复制
while(j <= end) {
tmp[k++] = array[j++];
}
// 将tmp赋值给原数组array
for(int l = 0; l < tmp.length; ++l) {
array[start + l] = tmp[l];
}
}
}