算法笔记--排序算法-分治法-归并排序
归并排序
时间复杂度
每一层的和都是 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 }