《C#数据结构和算法》-排序

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#数据结构和算法》-排序的更多相关文章
- luogu1347 排序
		题目大意 一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列.给你一系列形如A<B的关系,并要求你判断是否能够根据这些关系确定这个数列的顺序(能,矛盾,不确定).确定n个元素的顺序后 ... 
- <luogu1347>排序
		本来打算当打了个拓扑的板子 后来发现并不只是个板子 差不多 管他呢 #include<cstdio> #include<cstring> #include<iostrea ... 
- javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈
		Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ... 
- iOS可视化动态绘制八种排序过程
		前面几篇博客都是关于排序的,在之前陆陆续续发布的博客中,我们先后介绍了冒泡排序.选择排序.插入排序.希尔排序.堆排序.归并排序以及快速排序.俗话说的好,做事儿要善始善终,本篇博客就算是对之前那几篇博客 ... 
- JavaScript实现常用的排序算法
		▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ... 
- [C#][算法] 用菜鸟的思维学习算法 -- 马桶排序、冒泡排序和快速排序
		用菜鸟的思维学习算法 -- 马桶排序.冒泡排序和快速排序 [博主]反骨仔 [来源]http://www.cnblogs.com/liqingwen/p/4994261.html 目录 马桶排序(令人 ... 
- 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)
		本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ... 
- 算法与数据结构(七) AOV网的拓扑排序
		今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ... 
- 使用po模式读取豆瓣读书最受关注的书籍,取出标题、评分、评论、题材 按评分从小到大排序并输出到txt文件中
		#coding=utf-8from time import sleepimport unittestfrom selenium import webdriverfrom selenium.webdri ... 
- javascript排序
		利用array中的sort()排序 w3cfunction sortNumber(a,b) { return a - b } var arr = new Array(6) arr[0] = " ... 
随机推荐
- BZOJ2223[Coci 2009]PATULJCI——主席树
			题目描述 输入 先输入一个数n,然后一个数表示这n个数中最大的是多少,接下来一行n个数.然后一个数m,最后m行询问每次两个数l,r. 输出 no或者yes+这个数 样例输入 10 3 1 2 1 2 ... 
- python  numpy 数组拼接
			我就写一下我遇到的,更多具体的请看Python之Numpy数组拼接,组合,连接 >>> aarray([0, 1, 2], [3, 4, 5], [6, 7, ... 
- 自学Linux Shell12.2-test命令
			点击返回 自学Linux命令行与Shell脚本之路 12.2-test命令 if-then语句不能测试命令退出状态码之外的条件,test命令提供了在if-then语句中测试不同条件的途径. 如果tes ... 
- 自学Zabbix7.1 IT services
			自学Zabbix7.1 IT services 1. 概念IT Services 服务器或者某项服务.业务的可用率,不懂技术的上级领导会过问最近服务器可用率如何.所有api的状况怎么样?通常一些技术人 ... 
- 自学Zabbix之路15.1 Zabbix数据库表结构简单解析-Hosts表、Hosts_groups表、Interface表
			点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix之路15.1 Zabbix数据库表结构简单解析-Hosts表.Hosts_grou ... 
- luogu1970 花匠(dp)
			设f1[i]表示以1..i中某个合法序列的长度,而且最后一位是较大的 f2[i]表示以1..i中某个合法序列的长度,而且最后一位是较小的 那么就有$f1[i]=max\{f2[j]+1\},(j< ... 
- 【BZOJ1558】等差数列(线段树)
			[BZOJ1558]等差数列(线段树) 题面 BZOJ 题解 可以说这道题已经非常毒瘤了 怎么考虑询问操作? 如果直接将一段数分解为等差数列? 太麻烦了.... 考虑相邻的数做差, 这样等差数列变为了 ... 
- [HEOI2013]SAO ——计数问题
			题目大意: Welcome to SAO ( Strange and Abnormal Online).这是一个 VR MMORPG, 含有 n 个关卡.但是,挑战不同关卡的顺序是一个很大的问题. 有 ... 
- 两场CF
			分别是正规赛998和虚拟赛935 998我神速A了前三题之后挂了,第四题是一个打表找规律题然而我并没有想到打表... 然后靠着速度拿到470名,上了蓝名.这告诉我们:输入数据是一个数/两个数(noip ... 
- 自动检测ie低版本,并显示升级浏览器的自定义页面,当用f12再把浏览器版本提高的时候,又会自动显示正常的页面。
			代码: <!--[if lte IE 9 ]> <div class=""> //这里面可以添加自己定义的内容 </div> <scrip ... 
