当前位置: 首页 > news >正文

排序算法重点总结

排序算法重点总结

    • 前言
    • 排序算法稳定性
    • 排序算法特点
    • 相关资料

前言


排序是算法入门的第一关,对排序算法性能的评价指标主要有:时间复杂度、空间复杂度和稳定性。

直观上讲,时间复杂度指实现算法的时间长短,空间复杂度指实现算法所需的内存大小。复杂度越高,实现所需时间越长,内存越大。

排序算法稳定性


什么是稳定性?

  • 若排序比较的值相同时,排序后的相对顺序与排序前的相对顺序一致,则成为稳定排序
  • 举例说明
    • 比如a数列中,a3/a7对应的数值相同,排序后,a3依然在a7的前面。

什么时候要考虑排序稳定性的问题?

  • 如果数组只有单独键值,则一般无需考虑排序稳定性问题
  • 如果数组是个结构体,排序依据是其中一种键值,但其他值又不同时,希望键值相同时,不改变原始相对顺序。则务必要考虑排序稳定性。
  • 举例说明
    • 比如结构体数组a[20],其中i个a[i]里面存有:age,class, grade等值,已经按照grade分数总体降序排好
    • 现在要求再按照age年龄降序排列后,希望年龄相同时,依然按照原来的grade降序排列,不改变原来的顺序
    • 此时则需要考虑稳定性问题,以保证比较键值相同时,原始相对顺序不变

排序算法特点


那么哪些排序算法是稳定的呢?其算法实现的时间、空间复杂度又如何?

排序算法稳定性:

  • 仅以下排序算法是稳定的
    • 选择(冒泡)、插入和归并、基数
  • 其余均为不稳定:
    • 快排、希尔、简单选择排序、堆排and so on

8种排序算法特点:

其中,归并、快排、冒泡使用的较多。

归并算法特点:

  • 优势
    • 满足排序稳定
    • 最好最坏时间复杂度O(NlogN)
  • 劣势
    • 需增加O(N)的空间
  • 原理:
    • 类似树的后序遍历,先到底(无法再拆分为止),然后操作合并
    • 分治思想

相关资料


  1. 用C语言实现快速排序算法,link
  2. 8个算法复杂度及稳定性分析,link
  3. 菜鸟教程:排序算法总结及源代码实现,link

相关文章:

  • 【详解】Python基础操作之os模块常用命令
  • 计算机毕业设计ssm软件学院社团管理系统l62lq系统+程序+源码+lw+远程部署
  • stm32cubemx安装(出现JDK配置错误,导致无法安装)
  • 计算机毕业设计ssm散酒营销系统w5at6系统+程序+源码+lw+远程部署
  • Spring Cloud Gateway 网关整合 Knife4j
  • HIVE自定义UDTF函数
  • 脑机接口002 | 上海与长三角地区脑科学发展与跨学科合作
  • 常用的Linux命令
  • C++ 【模板和string模拟实现】
  • C语言拍品管理系统
  • 计算机毕业设计ssm社区流浪动物救助系统2r32k系统+程序+源码+lw+远程部署
  • 性能调优,看过的都说会了...
  • 基于springboot的通知反馈系统
  • pytorch 多GPU训练总结(DataParallel的使用)
  • 写文章的软件-免费写文章的软件
  • 【个人向】《HTTP图解》阅后小结
  • Consul Config 使用Git做版本控制的实现
  • ES学习笔记(12)--Symbol
  • golang 发送GET和POST示例
  • HTML5新特性总结
  • java8-模拟hadoop
  • JS笔记四:作用域、变量(函数)提升
  • js中forEach回调同异步问题
  • Linux CTF 逆向入门
  • markdown编辑器简评
  • SpiderData 2019年2月25日 DApp数据排行榜
  • v-if和v-for连用出现的问题
  • vue脚手架vue-cli
  • 山寨一个 Promise
  • 转载:[译] 内容加速黑科技趣谈
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • !$boo在php中什么意思,php前戏
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • $.ajax()
  • (1)bark-ml
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (二)学习JVM —— 垃圾回收机制
  • (利用IDEA+Maven)定制属于自己的jar包
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (转)jQuery 基础
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)视频码率,帧率和分辨率的联系与区别
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET 反射的使用
  • .NET 中 GetProcess 相关方法的性能
  • .NET单元测试
  • .NET中统一的存储过程调用方法(收藏)
  • .stream().map与.stream().flatMap的使用
  • /etc/sudoers (root权限管理)
  • [.net 面向对象程序设计进阶] (19) 异步(Asynchronous) 使用异步创建快速响应和可伸缩性的应用程序...
  • [20190113]四校联考
  • [BJDCTF2020]The mystery of ip1