zoukankan      html  css  js  c++  java
  • 排序算法---排序算法比较总结

    在n比较小时,快速排序最佳

    在n比较大时,堆排序和归并排序时间省,但是,归并排序所需的辅助空间较多

    直接插入排序最简单,在n较小且序列基本有序的情况下最佳

    基数排序是个n很大,并为关键字较小的序列

    稳定:直接插入排序、冒泡排序、归并排序、基数排序

      最好时间复杂度 平均时间复杂度 最坏时间复杂度 稳定性 复杂性 辅助空间 要点  
    冒泡排序 O(n) O(n^2) O(n^2) 稳定 简单 O(1) 相邻的两个比较,若逆序,交换,第i趟将第i大的元素交换到序列倒数第i个位置 附设标志位,某一趟没有元素交换,表明已经有序,直接结束
    快速排序 O(n logn) O(n logn) O(n^2) 不稳定 复杂 O(logn)~O(n)

    以序列的第一个元素为基准,将待排序列分成两部分,然后分别对这两部分进行快速排序

    low high两个指针,一开始指向序列开头和结尾,从high开始,找到第一个小于基准的数,和low交换,从low开始,找到第一个大于基准的数,和high交换,直到low==high

    递归

    可以不交换,直接覆盖

    直接插入排序 O(n) O(n^2) O(n^2) 稳定 简单 O(1)

    将第一个元素看成有序的,从第二个元素开始,将其插入已排序序列的合适位置

    移动元素
    希尔排序 O(n) O(n^1.5) O(n^2) 不稳定 复杂 O(1)

    缩小增量排序(最后一个增量为1,即为直接插入排序)

    待元素基本有序的时候,对整体进行一次直接插入排序

    增量序列中的值不要有除1之外的公因子
    简单选择排序 O(n^2) O(n^2) O(n^2) 不稳定 简单 O(1)

    第i趟,从n-i+1个元素中选出一个第i小的元素,记录该元素的小标,将该元素和数组下标为i-1的元素交换

    先假设子序列第一个是最小的

     
    堆排序 O(n logn) O(n logn) O(n logn) 不稳定 复杂 O(1)

    完全二叉树

    先建堆,从数组下标为n/2向下取整-1的元素依次向前进行调整

    输出堆顶元素,用最后一个元素代替堆顶元素,再调整堆

     
    归并排序 O(n logn) O(n logn) O(n logn) 稳定 复杂 O(n)

    先待排序列分成一个一个元素,然后逐一合并

    和待排序列一样大小的辅助空间

    参考两个顺序表的合并

    分治策略

    基数排序 O(d(r+n)) O(d(r+n) O(d(r+n) 稳定 复杂 O(rd+n)

    从最次关键字开始排序,直到最主关键字

    和待排序列一样大小的辅助空间

     
  • 相关阅读:
    作业DAY002
    作业DAY001
    作业 5:词频统计——增强功能
    在JdbcTemplate里面关于queryForMap返回值的疑问
    直接打印map, 为什么能直接输出value
    JdbcTemplate jar包 下载
    edge 修改链接打开方式
    Java中的判断实例
    关于Junit4 和 Junit5.4
    关于函数式接口, printable 自定义
  • 原文地址:https://www.cnblogs.com/duanjiapingjy/p/9561088.html
Copyright © 2011-2022 走看看