×

归并排序-Java实现

我的笔记 我的笔记 发表于2018-07-23 21:26:03 浏览2390 评论0

抢沙发发表评论

归并排序,作为分治思想的典型应用,值得掌握;在稳定性方面,是唯一复杂度为O(NlgN)的稳定排序。

 1 /**
 2  * Created by hardaway on 2018/7/23.
 3  * 归并排序
 4  * 分治思想,分:划分为规模更小的相似问题;治:将两个有序子序列整合为一个。
 5  * 时间复杂度O(NlgN), 最好,最坏,平均复杂度是O(NlgN)
 6  * 稳定排序
 7  */
 8 public class mergeSorting {
 9     public void sort(int[] arr){
10         sort(arr,0,arr.length-1);
11     }
12     public void sort(int[] arr, int head, int tail){
13         if(head>=tail)
14             return;
15         int mid = head+(tail-head)/2;
16         sort(arr, head, mid);
17         sort(arr, mid+1, tail);
18         format(arr,head,mid,tail);
19     }
20     public void format(int[] arr, int head, int mid, int tail){
21         int[] small = Arrays.copyOfRange(arr,head,tail+1);
22         int tp1 = 0;
23         int tp2 = mid-head+1;
24         int i = head;
25         int end1 = mid-head;
26         int end2 = tail-head;
27         while(tp1<=end1&&tp2<=end2){
28             if(small[tp1]<=small[tp2])
29                 arr[i++] = small[tp1++];
30             else
31                 arr[i++] = small[tp2++];
32         }
33         while(tp1<=end1){
34             arr[i++] = small[tp1++];
35         }
36         while (tp2<=end2){
37             arr[i++] = small[tp2++];
38         }
39     }
40 
41     public static void main(String[] args) {
42         int[] arr = {9,3,1,4,2,7,8,6,5};
43         System.out.println(Arrays.toString(arr));
44         mergeSorting m = new mergeSorting();
45         m.sort(arr);
46         System.out.println(Arrays.toString(arr));
47     }
48 }

 

我的笔记博客版权我的笔记博客版权