遞歸排序


先遞歸,在排序

首先考慮下如何將將二個有序數列合並。這個非常簡單,只要從比較二個數列的第一個數,誰小就先取誰,取了后就在對應數列中刪除這個數。然后再進行比較,如果有數列為空,那直接將另一個數列的數據依次取出即可。

解決了上面的合並有序數列問題,再來看歸並排序,其的基本思路就是將數組分成二組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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM