归并排序
归并排序利用递归思想将一个数组逐渐进行二分,直到二分到只有一个元素。
再倒着回来将其进行合并,在合并的过程中保证其合并完的结果有序(合并的两部分始终都是部分有序的),一直合并到成为一个完整的数组
图示:
代码及其解析:
1 public static void MergeSort(int[] arr) 2 { 3 if (arr.length == 1 || arr == null) { 4 return; 5 } 6 process(arr,0,arr.length - 1); 7 } 8 9 //递归进行划分子问题的排序 10 public static void process(int[] arr,int l,int r) 11 { 12 if (l == r) { 13 return; 14 } 15 int mid = l + ((r - l) >> 1); 16 process(arr,l,mid); 17 process(arr,mid + 1,r); 18 Merge(arr,l,mid,r); 19 } 20 21 //对两个有序的数组分布进行排序 22 public static void Merge(int[] arr,int l,int mid,int r) 23 { 24 int i = l , j = mid + 1; 25 int[] help = new int[r - l + 1]; 26 int cnt = 0; 27 //用双游标实现合并有序,即左右两部分的游标位置上的数相比,把小的数往合并的数组上放 28 while (i <= mid && j <= r) {//一个下标越界则可以停止比较 29 help[cnt++] = arr[i] <= arr[j] ? arr[i++] : arr[j++]; 30 } 31 //把剩下还没赋完的一边数组的值赋完 32 while (i <= mid) { 33 help[cnt++] = arr[i++]; 34 } 35 while (j <= r) { 36 help[cnt++] = arr[j++]; 37 } 38 for (int k = 0; k < r - l + 1 ; k++) 39 { 40 arr[k + l] = help[k]; 41 } 42 }