递归排序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归排序相关的知识,希望对你有一定的参考价值。
先递归,在排序
首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。
解决了上面的合并有序数列问题,再来看归并排序,其的基本思路就是将数组分成二组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 }
以上是关于递归排序的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript - 代码片段,Snippets,Gist
8种面试经典!排序详解--选择,插入,希尔,冒泡,堆排,3种快排,快排非递归,归并,归并非递归,计数(图+C语言代码+时间复杂度)
8种面试经典排序详解--选择,插入,希尔,冒泡,堆排,3种快排及非递归,归并及非递归,计数(图+C语言代码+时间复杂度)
8种面试经典排序详解--选择,插入,希尔,冒泡,堆排,3种快排及非递归,归并及非递归,计数(图+C语言代码+时间复杂度)