归并排序
基本思想:
将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。
算法分析:
时间复杂度:各种情况下都是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 }