“深入理解”—归并排序算法

来源:互联网 发布:铜牌在线制作软件 编辑:程序博客网 时间:2024/06/16 05:33


(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/70994874冷血之心的博客)

“深入理解”—选择排序算法

“深入理解”—交换排序算法

“深入理解”—插入排序算法


归并排序:

  归并排序 (merge sort) 是一类与插入排序、交换排序、选择排序不同的另一种排序方法。归并的含义是将两个或两个以上的有序表合并成一个新的有序表。

如图所示:


import java.util.Arrays;public class Test {      // 归并排序的实现      public static void main(String[] args) {            int[] nums = { 2, 7, 8, 3, 1, 6, 9, 0, 5, 4, -3};          System.out.println(Arrays.toString(nums));          sort(nums, 0, nums.length-1);          System.out.println(Arrays.toString(nums));      }        /**      * 归并排序      * 简介:将两个(或两个以上)有序表合并成一个新的有序表 即把待排序序列分为若干个子序列,     *     每个子序列是有序的。然后再把有序子序列合并为整体有序序列      * 时间复杂度为O(nlogn)      * 稳定排序方式      * @param nums 待排序数组      * @return 输出有序数组      */      public static int[] sort(int[] nums, int low, int high){    int mid = (low+high)/2;    if(low<high){    // 处理左边    sort(nums, low, mid);    // 处理右边    sort(nums, mid+1, high);    // 左右归并    merge(nums, low, mid, high);    }    return nums;    }    private static void merge(int[] nums, int low, int mid, int high) {// 定义一个辅助数组,所以该算法的空间复杂度为O(n)    int[] temp = new int[high-low+1];    int i = low;    int j = mid+1;    int k = 0;    // 找出较小值元素放入temp数组中    while(i<=mid && j<=high){    if(nums[i]<nums[j])    temp[k++] = nums[i++];    else    temp[k++] = nums[j++];    }    // 处理较长部分    while(i<=mid){    temp[k++] = nums[i++];    }    while(j<=high){    temp[k++] = nums[j++];    }    // 使用temp中的元素覆盖nums中元素    for (int k2 = 0; k2 < temp.length; k2++) {nums[k2+low] = temp[k2];}}}  


算法分析

(1)稳定性
      归并排序是一种稳定的排序。

(2)存储结构要求
     可用顺序存储结构。也易于在链表上实现。

(3)时间复杂度
     对长度为n的文件,需进行 趟二路归并,每趟归并的时间为O(n),故其时间复杂度无论是在最好情况下还是在最坏情况下均是O(nlgn)

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




如果对你有帮助,记得点赞哦~欢迎大家关注我的博客,可以进群366533258一起交流学习哦~





2 0
原创粉丝点击