1. 程式人生 > >遞歸排序

遞歸排序

遞歸 問題 algorithm system left 子數組 || 並排 數組合並

先遞歸,在排序

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

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

遞歸排序