一、基本原理:
- 对于给定的一组记录, 利用递归与分治的思想将数据序列划分为越来越小的半子序列;
- 再对半子序列排序;
- 最后用递归将排好序的半子序列合并成为越来越大的有序序列。
二、代码实现:
- 合并子序列时,需要申请两个序列加起来的长度的内存,临时存储新生成的序列
- 再将新生成的序列赋给原数组
- 注意:(1)新数组的下标范围0~right-left+1
(2)要考虑到当左子序列和右子序列长度一致,是根据元素的大小决定插入的前后顺序,所以
==while(i<=mid && j<=right)==中有等号
public static void MergeSort(int array[], int left, int right){
if(left < right){
int mid = (left + right)/2;
MergeSort(array, left, mid);
MergeSort(array, mid+1, right);
Merge(array, left, mid, right);
}
}
public static void Merge(int array[], int left, int mid, int right){
int arrNew[] = new int[right-left+1];
int i=left;
int j=mid+1;
int k=0;
while(i<=mid && j<=right){
if(array[i] > array[j]){
arrNew[k++] = array[j++];
}else{
arrNew[k++] = array[i++];
}
}
while(i<=mid){
arrNew[k++] = array[i++];
}
while(j<=right){
arrNew[k++] = array[j++];
}
for(int n=0; n<arrNew.length; n++){
array[left+n] = arrNew[n];
}
}