算法笔记--排序算法-分治法-归并排序

归并排序

时间复杂度

每一层的和都是 cn,共有 lgn+1 层,因此总的执行时间是 cnlgn + cn,相比 nlgn 来说,cn 项可以忽略,因此 T(n) 的上界是 Θ(nlgn)。

 

注:

设有 n 个叶子结点,满二叉树的层数为 k,有 2k-1=n,即 k-1=log2n,所以 k=lgn +1。就是说共有 lgn + 1 层

设每个叶子结点的执行时间是 c,则每一层的执行时间是 cn。

所以总执行时间是 cn ( lgn + 1 ) = cnlgn + cn。

 

 

 

Java代码

 1 public class MergeSort {
 2     
 3     public void sort(int a[], int s, int e) {
 4         if (s < e && s >= 0 && e < a.length) {
 5             int i = (s + e) / 2;
 6             sort(a, s, i); //左半边数组递归
 7             sort(a, i + 1, e); //右半边数组递归
 8             compareSort(a, s, e); //具体的计算方法
 9         }
10     }
11 
12     private void compareSort(int[] a, int s, int e) {
13         if (s >= 0 && e < a.length && e > s) {
14             int m = (s + e) / 2 + 1;  //中间位置
15             int start = s;
16             int mid = m;            
17             int[] temp = new int[e - s + 1];
18             int index = 0;
19             
20             //将数组劈成两半,以两边数组的左边第一个索引指向的数字开始互相比较,较小数的存入temp数组,索引+1
21             while (start < m && mid <= e) {
22                 if (a[start] <= a[mid]) {
23                     temp[index] = a[start];
24                     start++;
25                 } else {
26                     temp[index] = a[mid];
27                     mid++;
28                 }
29                 index++;
30             }
31             
32             //把没比较完的数按顺序写到temp数组中
33             if (index < temp.length) {
34                 if (start < m)
35                     for (int i = start; i < m; i++) {
36                         temp[index++] = a[i];
37                     }
38                 else if (mid <= e)
39                     for (int i = mid; i <= e; i++) {
40                         temp[index++] = a[i];
41                     }
42             }
43             for (int i = 0; i <= index; i++) {
44                 if (s + i <= e) {
45                     a[s + i] = temp[i];
46                 }
47             }
48         }
49     }
50 }

 

posted @ 2014-05-29 12:28  机智大脸喵  阅读(326)  评论(0编辑  收藏  举报