归并排序

基本思想:

将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。

算法分析:

时间复杂度:各种情况下都是O(nlgn)

空间复杂度:需要一个辅助向量来暂存两有序子文件归并的结果,故其辅助空间复杂度为O(n)

稳定性:稳定

Java实现:

 1 import java.util.Arrays;
 2 
 3 public class MergeSort {
 4     
 5     public static void merge(int[] array, int low, int midL, int high) {
 6         int[] tmpArray = new int[array.length];
 7         // 用于将排好序的临时数组复制回原数组
 8         int mark = low;
 9         // 第二个数组的低位
10         int midH = midL + 1;
11         int tmpLow = low;
12         while(low <= midL && midH <= high) {
13             // 从两个子数组中取出最小的放入临时数组,即按从小到大的顺序重新排布
14             if(array[low] <= array[midH]) {
15                 tmpArray[tmpLow++] = array[low++];
16             } else {
17                 tmpArray[tmpLow++] = array[midH++];
18             }
19         }
20         // 剩余部分依次放入临时数组
21         while(low <= midL) {
22             tmpArray[tmpLow++] = array[low++];
23         }
24         while(midH <= high) {
25             tmpArray[tmpLow++] = array[midH++];
26         }
27         // 将中间数组中的内容复制回原数组
28         while(mark <= high) {
29             array[mark] = tmpArray[mark++];
30         }
31     }
32     
33     public static void mergeSort(int[] array, int low, int high) {
34         if(low < high) {
35             int mid = (low + high) / 2;
36             // 将数组拆分为两份,并递归拆分子数组,直到数组中只有一个元素
37             mergeSort(array, low, mid);
38             mergeSort(array, mid + 1, high);
39             // 合并相邻数组
40             merge(array, low, mid, high);
41         }
42     }
43 
44     public static void main(String[] args) {
45         int[] array = {49, 38, 65, 97, 76, 13, 27, 49, 78, 34, 12, 64, 5, 4,  
46                 62, 99, 98, 54, 56, 17, 18, 23, 34, 15, 35, 25, 53, 51};
47         mergeSort(array, 0, array.length - 1);
48         System.out.println(Arrays.toString(array));
49     }
50 }

 

posted on 2015-04-08 14:34  绿树荫  阅读(137)  评论(0编辑  收藏  举报

导航