归并排序

来源:互联网 发布:学java要看什么书 编辑:程序博客网 时间:2024/06/16 21:57

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并


归并过程为:比较a[i]和b[j]的大小,若a[i]≤b[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1;否则将第二个有序表中的元素b[j]复制到r[k]中,并令j和k分别加上1,如此循环下去,直到其中一个有序表取完,然后再将另一个有序表中剩余的元素复制到r中从下标k到下标t的单元。归并排序的算法我们通常用递归实现,先把待排序区间[s,t]以中点二分,接着把左边子区间排序,再把右边子区间排序,最后把左区间和右区间用一次归并操作合并成有序的区间[s,t]。


一下图解可以更加清晰得解释这一分治过程。






public class MergeSort {static int[] array = {58,49,2,95,111,30,5,46,7,11,1,66,77,42,86,66,2};static int[] temp = new int[array.length];public static void main(String[] args) {// TODO Auto-generated method stubPrintArray(array);int start=0,end=array.length-1;mergeSort(start,end);PrintArray(array);}private static void mergeSort(int start, int end) {// TODO Auto-generated method stub//System.out.println("start and end is:"+start+" "+end);if(start<end){//System.out.println("start and end is:"+start+" "+end);int mid = (start+end)/2;mergeSort(start,mid);//分治过程mergeSort(mid+1,end);//递归实现merge(start,mid,end);//合并排序}//PrintArray(temp);}private static void merge(int start, int mid, int end) {// TODO Auto-generated method stubint i=start,j=mid+1,count=0;//temp数组从0开始记录while(i<=mid && j<=end ){//System.out.println("start and end is"+i+" "+j);if(array[i]<=array[j]) //较小数放入temp数组前{temp[count]=array[i];i++;count++;}else{temp[count]=array[j];j++;count++;}}while(i<=mid)  //将有序数组剩下的值赋给temp{temp[count]=array[i];i++;count++;}while(j<=end)  //将有序数组剩下的值赋给temp{temp[count]=array[j];j++;count++;}count=0;while(start<=end){ //把temp即排序后的数组复制到原数组对应的区间array[start]=temp[count];count++;start++;} }private static void PrintArray(int[] array) {// TODO Auto-generated method stubfor (int i =0; i< array.length;i++){System.out.print(array[i]+" ");}System.out.println("");}}