数据结构——各排序算法的比较

1.从时间复杂度比较 
  从平均时间复杂度来考虑,直接插入排序、冒泡排序、直接选择排序是三种简单的排序方法,时间复杂度都为O(n2),而快速排序、堆排序、二路归并排序的时间复杂度都为O(nlog2n),希尔排序的复杂度介于这两者之间。若从最好的时间复杂度考虑,则直接插入排序和冒泡排序的时间复杂度最好,为O(n),其它的最好情形同平均情形相同。若从最坏的时间复杂度考虑,则快速排序的为O(n2),直接插入排序、冒泡排序、希尔排序同平均情形相同,但系数大约增加一倍,所以运行速度将降低一半,最坏情形对直接选择排序、堆排序和归并排序影响不大.
2.从空间复杂度比较 
  归并排序的空间复杂度最大,为O(n),快速排序的空间复杂度为O(log2n),其它排序的空间复杂度为O(1)。 
3.从稳定性比较 
  直接插入排序、冒泡排序、归并排序是稳定的排序方法,而直接选择排序、希尔排序、快速排序、堆排序是不稳定的排序方法。 
4.从算法简单性比较 
  直接插入排序、冒泡排序、直接选择排序都是简单的排序方法,算法简单,易于理解,而希尔排序、快速排序、堆排序、归并排序都是改进型的排序方法,算法比简单排序要复杂得多,也难于理解。

  迄今为止,已有的排序方法远远不止本章讨论的这些方法,人们之所以热衷于研究多种排序方法,不仅是由于排序在计算机中所处的重要地位,而且还因为不同的方法各有其优缺点,可适用于不同的场合。选取排序方法时需要考虑的因素有
待排序的记录数目n;记录本身信息量的大小;关键字的结构及分布情况;对排序稳定性的要求;语言工具的条件,辅助表的大小等。依据这些因素,可得出如下几点结论:
(1)若n较小(譬如n50),可采用直接插入排序或直接选。由于直接插入排序所需记录移动操作较直接选择排序多,因此若记录本身信息量较大时,则选用直接选择排序为宜。 
(2)若文件的初始状态已是按关键字基本有序,则选用直接插入排序泡排序为宜。 
(3)若N较大,则应根据其时间复杂度来选择排序方法:快速排序\堆排序或归并排序,快速排序是目前基于内部排序的中被认为是最好的方法,档待排序的关键字是随机时,快速排序的平均时间最少,但堆排序所需的辅助空间少于快速排序,并且不会出现序可能出现的最坏情况,这两种排序方法都是不稳定的,若要求排序稳定则可选用归并排序。但本文章结合介绍的两两归并排算法并不值得提倡,通常可以将它和直接排序结合在一起用。先利用直接插入排序求得的子文件,然后再两两归并之。因为直接插入排序是稳定的,所以,改进后的归并排序是稳定的。
(4)前面讨论的排序算法,除排序外,都是在一维数组上实现的,当记录本身信息量较大时,为了避免浪费大量时间移动记录,可以用链表作为存储结构,如插入排序和归并排序都易于在链表上实现,并分别称之为表和归并表,但有的方法,如快速排序和堆排序,在链表上难于实现,在这种情况下,可以提取关键字建立索引表,然后,对索引表进行排序。然而更为简单的方法是;引入一个整形向量作为辅助表,排序前,若排序算法中要求交换,则只需交换R[I]和R[j]即可,排序结束后,向量就指示了记录之间的顺序关系.

转载于:https://www.cnblogs.com/sheropan/p/5022437.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/272661.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

将c程序移植到linux,各位大侠:我把原来在linux运行的c程序移植到HPUNIX上出现了错误...

各位大侠:我把原来在linux运行的c程序移植到HPUNIX上出现了错误(2012-04-11 00:43:47)标签:linuxc程序杂谈各位大侠:我把原来在linux运行的c程序移植到HP_UNIX上出现了错误makefileCC aCC -AA W829 DD64 DAportable-I/ods/app/oracle/produc…

数据库学习建议之提高数据库速度的十条建议

很多网站的重要信息都是保存在数据库中的,用户通过提交访问数据库来获取用户信息。如果数据库速度非常的快,有助于节省服务器的资源,在这篇文章中,我收集了十个优化数据库速度的技巧。0. 小心设计数据库第一个技巧也许看来理所当然…

Java中数据类型的取值范围

整数数据类型的取值范围 我们都知道计算机的底层是二进制,也知道不同的整数类型存储值的范围不同,可这些数值在计算机底层是怎样存储的呢?数值范围又是怎么计算出来的呢? 下面以java来进行举例: byte 1个字节 (8bit…

linux的cpu信息怎么理解,理解Linux下的CPU信息:lscpu cpuinfo

通过lscpu命令,可以看到CPU的一些基本信息。如下所示,可以很清楚的看到这台服务器使用两个物理socket,每个socket上有6个core,每个core上有两个线程(超线程),所以一共有2 * 6 * 2 24个逻辑CPU。Architecture: x86_64C…

如何降低SQL语句复杂度

SQL语句复杂度的优化就是在结果正确的前提下,将复杂、难以维护的SQL语句拆分成独立、易懂的SQL片段,当然也要充份利用索引,减少表描的I/O次数,尽量避免表搜索的发生。下面介绍降低SQL语句复杂度的几个建议1、动态查询语句一些应用…

提高程序员工作效率的11个技巧

“吃苦耐劳”真的是优良品质吗,与你怎么做相比,老板们应该更关心你做了什么、达到的效果。所以,效率,还是效率,希望这些实用小技巧对大家有所帮助。1、两分钟法则如果一件事可以在两分钟内完成,比如回复邮件…

tq3358 linux 串口驱动编程,TQ335x——spidev驱动的生成

kernel:CD盘的kernel3.2包环境:vmware10,ubuntu14.04修改的部分:arch/arm/mach-omap2/board-am335xevm.c文件中static struct spi_board_info am335x_spi1_slave_info[] {{.modalias "smb380",.platform_data &A…

Linux下显示ip所属位置

在linux下,要是网络出现延迟,通常我们需要分析自己到对端的服务器的网络环境 1 例:ping www.baidu.com 2 traceroute www.baidu.com 通过分析来确定大概是什么问题,可当我们去跟踪某个ip的时候不知道来源,假如每一个…

C#程序集相关的概念

程序集包含:类型元数据(描述在代码中定义的每一类型和成员,二进制形式)。程集元数据(程序集清单、版本号、名称等)、IL代码(这些都被装在exe或dll中)、资源文件。每个程序集都有自己…

linux+删除乱码的文件,linux 下删除乱码文件-乾颐堂

在linux下删除文件,遇到特殊字符是一件非常头疼的事情。1. 如果文件名带 ‘-’ 或者‘--’这样的字符删除办法为:rm -- 文件名如文件名为:-pythontab.tgz如果用普通方法去删除:1rm -pythontab.tgz结果错误:rm: invalid…

程序员如何保护自己的颈椎

我们程序员天天对着电脑,眼睛,颈椎等等,都会落下不少的职业病。来说说怎么治疗自己的颈椎病。1、颈椎病是怎么产生的形成颈椎病的核心原因是:不良生活习惯我们身体的绝大部分疾病都是来自不良的生活习惯,生活习惯不改&…

如何改变XCode的默认设置

改变bundle ID 进入 /Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Project Templates/Application 目录然后进入各个子目录(Navigation-based ApplicationOpenGL ES ApplicationSplit View-based ApplicationTab Bar ApplicationUtility ApplicationView-b…

linux关机时循环输出脚本,Linux关机时执行指定脚本功能实现

1.关机时执行某个脚本的具体思路(1)在文件夹/etc/init.d/下创建关机时需要执行的脚本file_name;(2)分别在文件夹/etc/rc0.d/和/etc/rc6.d/下创建该该脚本文件的链接文件K07file_name:sudo ln -s /etc/init.d/file_name /etc/rc0.d/K07file_namesudo ln -…

URI和URL及URN的区别

对于URL,大家都比较熟悉,其他两个词就比较陌生了。URI、URL和URN是识别、定位和命名互联网上的资源的标准途径。1989年Tim Berners-Lee发明了互联网(World Wide Web)。WWW被认为是全球互连的实际的和抽象的资源的集合–它按需求提供信息实体–…

Linux基础-目录与路径

今天我们一起来认识下linux中的目录与路径及操作其的一些常用命令。 说起路径就有绝对与相对之分,虽然简单,我们还是再啰嗦一下: 绝对路径,从系统的根目录/开始的目录都是相对路径,比如/usr/bin、/usr/local 相对路径…

螺旋图形Linux,Canvas 螺旋线几何图形绘制

JavaScript语言:JaveScriptBabelCoffeeScript确定window.requestAnimFrame (function() {return window.requestAnimationFrame ||window.webkitRequestAnimationFrame ||window.mozRequestAnimationFrame ||window.oRequestAnimationFrame ||window.msRequestAnim…

28家知名IT公司名称的由来

28家IT公司名称由来,你知道吗?EMC、VMware、IBM、Oracle、NetApp、Citrix、Cisco、Google、Amazon、Alibaba、UCloud、Tencent、Baidu等著名的存储、备份或云计算行业的IT公司,相信你我都是耳熟能详,但这些公司的名称是如何而来的…

编程应该用 Mac ,还是 PC ?

爱编程,不爱修电脑;爱学习,更爱运动;爱科技,也爱娱乐;爱工作,不爱加班。爱幽默、爱生活、爱浪漫、爱打拼,我是程序员,我为自己代言,关注程序员,分…

linux创建虚拟声卡,Pear BIOS 安装和配置指引

Pear BIOS 安装指引Pear BIOS是一套硬件模拟系统,操作系统可以在这套模拟硬件上运行。Pear BIOS可以让用户同时安装多套操作系统,使用时可以选择任何一套操作系统启动。在传统电脑系统上,操作系统可以识别并必须识别硬件;而在这套…

左右值

C/C语言中可以放在赋值符号左边的变量,即具有对应的可以由用户访问的存储单元,并且能够由用户去改变其值的量。左值表示存储在计算机内存的对象,而不是常量或计算的结果。或者说左值是代表一个内存地址值,并且通过这个内存地址&am…