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)

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

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

     
  • 相关阅读:
    SQL中的选择判断
    Rsync
    LAMP性能优化的一些建议
    Toad9.7与Oracle11g在X86的Win7下的情况
    IIS中IUSR_和IWAM_:计算机名帐户的用户名和密码的用途
    winform编程中的跨线程访问资源(转)
    MSTDC服务的应用及相关错误的解决方案(转载)
    SQL Server 错误代码详解
    poj 1777梅森素数
    hdu 2815 baby_step c可为非素数
  • 原文地址:https://www.cnblogs.com/duanjiapingjy/p/9561088.html
Copyright © 2011-2022 走看看