归并排序
* 归并排序:时间复杂度T(N) = a*T(N/b) + O(N^d)
* log(b,a) = d=1 --> 复杂度为O(N^d * logN) -->O(n*logn)
* 空间复杂度O(n)
* 稳定性:不会交换相同数的位置,是一个稳定方法
话不多说,直接上代码:
public class MergeSort { public static void mergeSort(int[] arr,int L,int R){ // 如果数组就还剩一个数,弹出; if(L==R){ return; } // 获取中点 mid= L + (R-l)/2 防止下标溢出 int mid =(L+R)/2; // 对左半部分进行归并:分解 mergeSort(arr,L,mid); // 对右半部分进行归并:分解 mergeSort(arr,mid+1,R); // 调用真正的排序方法:合并 sort(arr,L,mid,R); } public static void sort(int[] arr,int L,int mid,int R){ // 创建一个辅助数组;这里应该是R-L+1表示的是仅本次执行的数量个数。 int[] help=new int[R-L+1]; // 作为辅助数组的下标 int j=0; // 作为判断以及赋值的下标 int p=L; // 作为判断以及赋值的下标 int q=mid+1; // while(p<=mid&&q<=R){ help[j++]=arr[p]>arr[q]?arr[p++]:arr[q++]; } // 如果p不满足条件,说明q已经执行完毕,只剩下p对应的数组,直接将剩下的进行赋值 while(p<=mid){ help[j++]=arr[p++]; } // 如果p不满足条件,说明q已经执行完毕,只剩下p对应的数组,直接将剩下的进行赋值 while(q<=R){ help[j++]=arr[q++]; } // 将结果放到最后的数组中。 for(int i=0;i<=help.length-1;i++){ arr[L+i]=help[i]; } } public static void main(String[] args) { // TODO Auto-generated method stub // 初始值 int[] arr = {1,3,5,7,9,2,4,6,8}; // 调用方法 mergeSort(arr,0,arr.length-1); for (int i : arr) { System.out.println(i); } } }
具体执行过程如下图所示:注意递归的跳转
递归完全铺开的示意图如下