主要思想为分治算法思想
分治算法:就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)
归并思利用递归树的形式:
递归树,
java代码实现:
public class Merge_SortTest {public static void main(String[] args) {int[] a = { 49, 38, 65, 97, 76, 13, 27, 50,1 };merge_sort c=new merge_sort();c.mergeSort(a, 0, a.length-1);System.out.println("排好序的数组:");for (int e : a)System.out.print(e+" ");}}class merge_sort{public merge_sort() {}//两路归并算法,两个排好序的子序列合并为一个子序列public void merge(int []a,int left,int mid,int right){int []tmp=new int[a.length];//辅助数组int p1=left,p2=mid+1,k=left;//p1、p2是检测指针,k是存放指针while(p1<=mid && p2<=right){if(a[p1]<=a[p2])tmp[k++]=a[p1++];elsetmp[k++]=a[p2++];}while(p1<=mid) tmp[k++]=a[p1++];//如果第一个序列未检测完,直接将后面所有元素加到合并的序列中while(p2<=right) tmp[k++]=a[p2++];//同上//复制回原素组for (int i = left; i <=right; i++)a[i]=tmp[i];}public void mergeSort(int[] a,int start,int end){if(start<end){//当子序列中只有一个元素时结束递归int mid=(start+end)/2;//划分子序列mergeSort(a, start, mid);//对左侧子序列进行递归排序mergeSort(a, mid+1, end);//对右侧子序列进行递归排序merge(a, start, mid, end);//合并}}}
