博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
归并排序
阅读量:6864 次
发布时间:2019-06-26

本文共 1785 字,大约阅读时间需要 5 分钟。

复习八大基础排序算法。分类:

  1. 插入类(直接插入、希尔排序)
  2. 选择类(直接选择、堆排序)
  3. 交换类(冒泡排序、快速排序)
    4. 归并排序
  4. 还有外部排序(桶排序?)

复杂度分析

  1. 空间复杂度: 2N + O(logN) (原始数组+辅助数组+递归过程)
  2. 时间复杂度: Nlog(N)

    Principle: T(N) = 2*T(N/2) + N (两个子问题+ merge)

    证明可以画递归树、或代数演算、或归纳法(最容易推导)

代码如下

递归地(TopDown)

public static void mergeSort(Comparable[] a) {        aux = new Comparable[a.length];        sort(a, 0, a.length - 1, 0);    }        private static void sort(Comparable[] a, int lo, int hi, int dep) {for (int i = 0; i < dep; i++)   StdOut.print("    ");StdOut.println(String.format("sort(a[], %d, %d)", lo, hi));             if (hi <= lo)   return;        int mid = (lo + hi) / 2;        sort(a, lo, mid, dep+1);        sort(a, mid + 1, hi, dep+1);        merge(a, lo, mid, hi);    }    private static void merge(Comparable[] a, int lo, int mid, int hi) {        assert isSorted(a, lo, mid);        assert isSorted(a, mid+1, hi);                // 复制a[]到aux[]        for (int k = lo; k <= hi; k++)  aux[k] = a[k];        // 归并        int i = lo, j = mid+1;        for (int k = lo; k <= hi; k++) {            if (i > mid)        a[k] = aux[j++];  //左半边遍历完了            else if (j > hi)    a[k] = aux[i++];  //右半边遍历完了            else if (less(aux[i], aux[j]))  a[k] = aux[i++];  // a[i]比a[j]小            else                a[k] = aux[j++];    // j 位置较小        }                assert isSorted(a);    }

图示

6b9392ddgw1f302kgyh8uj20f30bw40l.jpg

非递归地(BottomUp)

public static void bottomUpMergeSort(Comparable[] a) {        aux = new Comparable[a.length];        int N = a.length;        for (int sz = 1; sz < N; sz += sz)  // sz是子序列的长度,依次为 1, 2, 4, 8, 16, ... ,直到 N                      for (int lo = 0; lo < N - sz + 1; lo += 2*sz)   // lo是合并所得子序列的下标,如sz=2时,lo依次为 0, 4, 8,...                merge(a, lo, lo+sz-1, Math.min(lo+2*sz-1, N-1));    }

转载于:https://www.cnblogs.com/smartjune/p/5402636.html

你可能感兴趣的文章
我的友情链接
查看>>
Cisco 3560 丢失 IOS 解决过程
查看>>
C语言初学者简单语法综合练习
查看>>
UITabBarController跳转任意界面的方法
查看>>
Quartz cron表达式
查看>>
linux环境变量
查看>>
如何在Debian 8/7上安装PostgreSQL 9.6
查看>>
__sync_fetch_and_add
查看>>
Samba的主配置文件
查看>>
css基础 设置链接颜色
查看>>
我的友情链接
查看>>
CISCO路由器产品配置手册
查看>>
Android 轮询最佳实践 Service + AlarmManager+Thread
查看>>
Android adb常用命令
查看>>
2012组策略自动部署wsus
查看>>
淘宝天猫网站停止支持IE6、IE7浏览器,你还在用xp吗?
查看>>
Jupyter Notebook 添加目录
查看>>
如何在Linux上从命令行嗅探HTTP流量
查看>>
AIX下两个常用命令
查看>>
从抵触到力推,.Net Core 的成功让微软正视开源
查看>>