归并排序

归并排序利用递归思想将一个数组逐渐进行二分,直到二分到只有一个元素。

再倒着回来将其进行合并,在合并的过程中保证其合并完的结果有序(合并的两部分始终都是部分有序的),一直合并到成为一个完整的数组

图示:

 

 

代码及其解析:

 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     }

 

posted @ 2022-04-05 16:22  jue1e0  阅读(18)  评论(0)    收藏  举报