首页 > 代码库 > 递归排序
递归排序
先递归,在排序
首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。
解决了上面的合并有序数列问题,再来看归并排序,其的基本思路就是将数组分成二组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 }
递归排序
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。