Algorithm | Merge Sort 并归排序
by Botao Xiao
并归排序
并归排序的原理
- 当两个数组本身是有序的,我们通过并归排序后仍然是有序的。
原地并归
- 在进行并归时,如果我们要为每次递归创建一个新的数组将会是很大的开销,所以我们在一开始初始化一个aux,其长度和我们要排序的数组一致。
private static void merge(int[] nums, int lo, int mid, int hi){
for(int i = lo; i <= hi; i++)
aux[i] = nums[i];
int i = lo, j = mid + 1;
for(int k = lo; k <= hi; k++){
if(i > mid) nums[k] = aux[j++];
else if(j > hi) nums[k] = aux[i++];
else if(aux[i] <= aux[j]) nums[k] = aux[i++];
else nums[k] = aux[j++];
}
}
排序(自顶向下),利用了分治的思想
public static void sort(int[] nums, int lo, int hi){
aux = new int[nums.length];
if(lo >= hi) return;
int mid = (hi - lo) / 2 + lo;
sort(nums, lo, mid); //将mid左侧的所有元素排序。
sort(nums, mid + 1, hi); //将mid右侧的所有元素排序。
merge(nums, lo, mid, hi); //此时左右已经是有序的了,我们在将左右并归起来。
}
Subscribe via RSS