归并排序的核心思想是分治法,将一个需要排序的数组分成很多个部分,使每一部分分别有序之后再合并两部分,最后整个数组就会是一个有序的数组。
算法设计采用两部分解决,一部分将数组分成两部分,递归直到子数组只有一个元素,另一部分负责合并两个子数组,从两个子数组第一个元素开始遍历,选取小的一个作为合并好的数组的第一个,第二次比较被选取了元素的数组的第二个元素和另一个数组的第一个元素,以此类推,直到两个子数组都被遍历完,这样,得到的数组就是将两个子数组排好序的数组。
实现代码如下:
public class MergeSort {
/**
* 将两个有序的数组合并为一个有序的数组
* @param arr
* @param begin
* @param middle
* @param end
*/
public void sort(int[] arr, int begin, int middle, int end){
int[] temp = new int[end-begin+1];
int first = begin;
int second = middle+1;
int k = 0;
while(first<=middle&&second<=end){ //如果两部分都还没遍历完
if(arr[first]<=arr[second]){
temp[k++] = arr[first++];
}else{
temp[k++] = arr[second++];
}
}
while(first<=middle){ //后半部分遍历完
temp[k++] = arr[first++];
}
while(second<=end){ //前半部分遍历完
temp[k++] = arr[second++];
}
for(int i=0;i<k;i++){ //将排好序的部分放回原数组相应位置
arr[i+begin] = temp[i];
}
}
/**
* 将数组分为两个部分,并使其分别有序,最后再合并为一个有序的数组
* @param arr 需要排序的数组
* @param begin 第一个元素下标
* @param end 最后一个元素下标
*/
public void merge(int[] arr, int begin, int end){
if(begin<end){
int middle = (begin+end)/2;
merge(arr, begin, middle);
merge(arr, middle+1, end);
sort(arr, begin, middle, end);
}
}
}