7.7 各种排序方法的比较与讨论
排序在计算机程序设计中非常重要,上面介绍的各种排序方法各有优缺点,
适用的场合也各不相同。在选择排序方法时应考虑的因素有:
( )待排序记录的数目 n 的大小;
( )记录本身除关键码外的其它信息量的大小;
( )关键码的情况;
( )对排序稳定性的要求;
( )语言工具的条件,辅助空间的大小等。
综合考虑以上因素,可以得出如下结论:
( )若排序记录的数目 n 较小(如 n≤)时,可采用直接插入排序或简
单选择排序。由于直接插入排序所需的记录移动操作较简单选择排序多,因而当
记录本身信息量较大时,用简单选择排序比较好。
( )若记录的初始状态已经按关键码基本有序,可采用直接插入排序或冒
泡排序。
( )若排序记录的数目n较大,则可采用时间复杂度为O(nlog2n)的排序
方法(如快速排序、堆排序或归并排序等)。快速排序的平均性能最好,在待排
序序列已经按关键码随机分布时,快速排序最适合。快速排序在最坏情况下的时
间复杂度是O(n2),而堆排序在最坏情况下的时间复杂度不会发生变化,并且所
需的辅助空间少于快速排序。但这两种排序方法都是不稳定的排序,若需要稳定
的排序方法,则可采用归并排序。
()基数排序可在 O(d×n)(d 为关键码的个数,当 n 远远大于 d 时)时
间内完成对 n 个记录的排序,但基数排序只适合于字符串和整数这种有明显结构
特征的关键码。当 n 很大、d 较小时,可采用基数排序。
()前面讨论的排序算法,除基数排序外,其它排序算法都是采用顺序存
储结构。在待排序的记录非常多时,为避免花大量的时间进行记录的移动,可以
采用链式存储结构。直接插入排序和归并排序都可以非常容易地在链表上实现,
但快速排序和堆排序却很难在链表上实现。此时,可以提取关键码建立索引表,
然后对索引表进行排序。也可以引入一个整形数组 t[n]作为辅助表,排序前令
t[i]=i,≤i≤n。若排序算法中要求交换记录 R[i]和 R[j],则只须交换 t[i]
和 t[j]即可。排序结束后,数组 t[n]就存放了记录之间的顺序关系。
7.8 C#中排序方法
C#语言中的许多类都提供了排序的成员方法。比如,在第四章介绍的数组
类 Array 就提供了排序方法 Sort。 Array 类中的排序方法采用的是快速排序算法,
并且要求数组中的数据元素必须实现 IComparable 接口,这样数据元素之间才能
进行比较。实际上,任何类型的数据都是使用比较器进行排序,所以,该类型要
实现排序方法,都必须实现 IComparable 接口。泛型类实现了泛型 IComparable
接口,非泛型类实现非泛型 IComparable 接口。 C#中提供了 Comparer 类来实现
各种比较器。 又比如,泛型 List 类也实现了 Sort 方法。 Sort 方法使用 Comparer 类的比较
器来决定 List<T>类中数据元素的顺序。比较器首先检查 List<T>类中数据元素是
否实现了泛型 IComparable 接口,如果实现了比较器就使用该实现,否则,比较
器再检查数据元素是否实现了非泛型 IComparable 接口,如果实现了就使用该实
现。如果这两种接口都没有实现,比较器将抛出一个 InvalidOperationException
异常 法使用了数组类 Array 的 Sort 方法。
同样,ASP.NET 2.0 中的GridView控件也实现了Sort方法。GridView控件的
类似于DataGrid控件,但比DataGrid控件更吸引人,使用更方便,程序员写
的代码也更少。Sort方法使用排序表达式和排序方向对GridVie控件进行排序。
排序表达式用于决定要排序的列,它可以对多列进行排序。排序方向决定是升序
还是降序排序。 7.7 各种排序方法的比较与讨论
排序在计算机程序设计中非常重要,上面介绍的各种排序方法各有优缺点,
适用的场合也各不相同。在选择排序方法时应考虑的因素有:
( )待排序记录的数目 n 的大小;
( )记录本身除关键码外的其它信息量的大小;
( )关键码的情况;
( )对排序稳定性的要求;
( )语言工具的条件,辅助空间的大小等。
综合考虑以上因素,可以得出如下结论:
( )若排序记录的数目 n 较小(如 n≤)时,可采用直接插入排序或简
单选择排序。由于直接插入排序所需的记录移动操作较简单选择排序多,因而当
记录本身信息量较大时,用简单选择排序比较好。
( )若记录的初始状态已经按关键码基本有序,可采用直接插入排序或冒
泡排序。
( )若排序记录的数目n较大,则可采用时间复杂度为O(nlog2n)的排序
方法(如快速排序、堆排序或归并排序等)。快速排序的平均性能最好,在待排
序序列已经按关键码随机分布时,快速排序最适合。快速排序在最坏情况下的时
间复杂度是O(n2),而堆排序在最坏情况下的时间复杂度不会发生变化,并且所
需的辅助空间少于快速排序。但这两种排序方法都是不稳定的排序,若需要稳定
的排序方法,则可采用归并排序。
()基数排序可在 O(d×n)(d 为关键码的个数,当 n 远远大于 d 时)时
间内完成对 n 个记录的排序,但基数排序只适合于字符串和整数这种有明显结构
特征的关键码。当 n 很大、d 较小时,可采用基数排序。
()前面讨论的排序算法,除基数排序外,其它排序算法都是采用顺序存
储结构。在待排序的记录非常多时,为避免花大量的时间进行记录的移动,可以
采用链式存储结构。直接插入排序和归并排序都可以非常容易地在链表上实现,
但快速排序和堆排序却很难在链表上实现。此时,可以提取关键码建立索引表,
然后对索引表进行排序。也可以引入一个整形数组 t[n]作为辅助表,排序前令
t[i]=i,≤i≤n。若排序算法中要求交换记录 R[i]和 R[j],则只须交换 t[i]
和 t[j]即可。排序结束后,数组 t[n]就存放了记录之间的顺序关系。

《C#数据结构和算法》-排序的更多相关文章

  1. luogu1347 排序

    题目大意 一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列.给你一系列形如A<B的关系,并要求你判断是否能够根据这些关系确定这个数列的顺序(能,矛盾,不确定).确定n个元素的顺序后 ...

  2. <luogu1347>排序

    本来打算当打了个拓扑的板子 后来发现并不只是个板子 差不多 管他呢 #include<cstdio> #include<cstring> #include<iostrea ...

  3. javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈

    Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...

  4. iOS可视化动态绘制八种排序过程

    前面几篇博客都是关于排序的,在之前陆陆续续发布的博客中,我们先后介绍了冒泡排序.选择排序.插入排序.希尔排序.堆排序.归并排序以及快速排序.俗话说的好,做事儿要善始善终,本篇博客就算是对之前那几篇博客 ...

  5. JavaScript实现常用的排序算法

    ▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ...

  6. [C#][算法] 用菜鸟的思维学习算法 -- 马桶排序、冒泡排序和快速排序

    用菜鸟的思维学习算法 -- 马桶排序.冒泡排序和快速排序 [博主]反骨仔 [来源]http://www.cnblogs.com/liqingwen/p/4994261.html  目录 马桶排序(令人 ...

  7. 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)

    本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...

  8. 算法与数据结构(七) AOV网的拓扑排序

    今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...

  9. 使用po模式读取豆瓣读书最受关注的书籍,取出标题、评分、评论、题材 按评分从小到大排序并输出到txt文件中

    #coding=utf-8from time import sleepimport unittestfrom selenium import webdriverfrom selenium.webdri ...

  10. javascript排序

    利用array中的sort()排序 w3cfunction sortNumber(a,b) { return a - b } var arr = new Array(6) arr[0] = " ...

随机推荐

  1. python构建bp神经网络_曲线拟合(一个隐藏层)__2.代码实现

    IDE:jupyter 抽象程度可能不是那么高,以后再优化. 理论和代码实现的差距还是挺大的 数据集请查看 python构建bp神经网络(一个隐藏层)__1.数据可视化 部分代码预览 git上传.ip ...

  2. Nginx反代至Tomcat基于memcached的session保持

    实现功能:基于前面tomcat基础简介与示例文章 (1) tomcat cluster将会话保存至memcached中:实现模型: 这里写图片描述 配置B,C主机安装openjdk与tomcat[本次 ...

  3. BZOJ 4754 [JSOI2016]独特的树叶 | 树哈希判同构

    题目链接 这道题是一道判断无根树同构的模板题,判断同构主要的思路就是哈希. 一遇到哈希题,一百个人能有一百零一种哈希方式,这篇题解随便选用了一种--类似杨弋<Hash在信息学竞赛中的一类应用&g ...

  4. get skill

    Get Skill 2018-01-16 > 001 防止数组越界的一种方法 ]; array[n%] = value; > 002 超时机制 在等待某个事件或标志时,设定一定时限,时限到 ...

  5. php关于Session和cookie总结

    什么是 Cookie? cookie 常用于识别用户.cookie 是服务器留在用户计算机中的小文件.每当相同的计算机通过浏览器请求页面时,它同时会发送 cookie.通过 PHP,能够创建并取回 c ...

  6. 调用系统命令之subprocess模块

    除了常见的os.system和os.popen方法,官方强烈推荐使用subprocess来调用系统命令. 这个库用起来其实很简单,按照惯例先贴一下官文关键点: The subprocess modul ...

  7. Java:判断当前操作系统界面采用的主题是windows经典样式还是xp样式

    想起两三年前,发现写Java界面的时候,如果将当前界面的layout设为null,由于windows的不同主题界面下,标题栏的高度不一致,导致当前界面表现也不一致. 当时就想找到一个办法先判断当前用户 ...

  8. property(四十)

    一个静态属性property本质就是实现了get,set,delete三种方法 用法: class Foo: @property def AAA(self): print('get的时候运行我啊') ...

  9. apigateway-kong(六)认证

    到上游服务(API或微服务)的流量通常由各种Kong认证插件的应用程序和配置来控制.由于Kong的服务实体(Service Entity)代表自己的上游服务的1对1映射,最简单的方案是在选择的服务上配 ...

  10. 约会 音频mm教你追女孩

    微信吧地址发给他人. 美团提前选好环境然后提前打电话订购一个位置. 微博作用是为:更多的谈资.热搜 ,最近上榜的话题说. 打车软件: 地图: 2.外表: 下澡,指甲,胡子,发型,适合服装.发型和服装搭 ...