递归排序

先递归,在排序

首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。

解决了上面的合并有序数列问题,再来看归并排序,其的基本思路就是将数组分成二组A,B,如果这二组组内的数据都是有序的,那么就可以很方便的将这二组数据进行排序。如何让这二组组内数据有序了?

可以将A,B组各自再分成二组。依次类推,当分出来的小组只有一个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的二个小组就可以了。这样通过先递归的分解数列,再合并数列就完成了归并排序。

 1 public class MergeSortAlgorithm {
 2 
 3     public static void main(String[] args) {
 4         int[] arr={5,54,12,78,45,9,82,62,55,8,0,6,-8,101};
 5         MergeSortAlgorithm p=new MergeSortAlgorithm();
 6         p.mergesort(arr, 0, arr.length-1);
 7         for(int i=0;i<arr.length;i++){
 8             System.out.print(arr[i]+" ");
 9         }
10     }
11     /*将数组递归分为多个子数组,在依次排序合并*/
12     public void mergesort(int[] arr,int left,int right){
13         if(left>=right){
14             return;
15         }else{
16             int center=(left+right)/2;
17             mergesort(arr,left,center);
18             mergesort(arr,center+1,right);
19             mergeArr(arr,left,center,right);
20         }
21     }
22     /*将两个有序数组合并为一个数组*/
23     public void mergeArr(int[] arr,int left,int center,int right){
24         if(arr==null||left>right){
25             return;
26         }else{
27             int i=left,j=center+1,k=0;
28             int[] temp=new int[right-left+1];
29             while(i<=center&&j<=right){
30                 if(arr[i]<arr[j]){
31                     temp[k++]=arr[i++];
32                 }else{
33                     temp[k++]=arr[j++];
34                 }
35             }
36             while(i<=center){
37                 temp[k++]=arr[i++];
38             }
39             while(j<=right){
40                 temp[k++]=arr[j++];
41             }
42             for(int z=0;z<k;z++){
43                 arr[left+z]=temp[z];
44             }
45         }
46     }
47 }

 

posted @ 2017-05-07 14:16  lulushow  阅读(2934)  评论(0编辑  收藏  举报