一、归并排序的基本思想
将待排序序列R[0...n-1]看成是n个长度为1的有序序列,将相邻的有序表成对归并,得到n/2个长度为2的有序表;将这些有序序列再次归并,得到n/4个长度为4的有序序列;如此反复进行下去,最后得到一个长度为n的有序序列。
综上可知:
归并排序其实要做两件事:
(1)“分解”——将序列每次折半划分。
(2)“合并”——将划分后的序列段两两合并后排序。
public class Test{
public static void main(String[] arge){
int[] arr = {25,34,45,32,78,12,34,64};
mergeSort(arr, 0, arr.length-1);
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
}
public static void mergeSort(int[] arr,int begin,int end){ //四个参数:原数组,临时数组,首、尾角标
if(begin<end){ //只有一个数,不执行排序
int middle = (begin+end)/2; //从中间划分为两个子序列
mergeSort(arr, begin, middle); //对左半边进行递归
mergeSort(arr,middle+1,end); //对右半边进行递归
merge(arr,begin,end,middle); //归并
}
}
public static void merge(int[] arr,int begin,int end,int middle){
int i,j;
int temp[] = new int[arr.length+1];
for(i=begin;i<=end;i++){ //将数组存入临时数组
temp[i] = arr[i];
}
i=begin;
j=middle+1;
while(i<=middle && j<=end){
if(temp[i]<=temp[j]){ //左右两边的首个元素,较小的放入原数组
arr[begin++] = temp[i++];
}else{
arr[begin++] = temp[j++];
}
}
while(i<=middle){ //只剩下左边,直接复制
arr[begin++] = temp[i++];
}
while(j<=end){ //只剩下右边,直接复制
arr[begin++] = temp[j++];
}
}
}