《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] = " ...
随机推荐
- PHP页面显示中文字符出现乱码
[出现问题] php页面显示中文字符出现乱码 [解决方法] 在php页面的代码前插入一行代码即可 header("Content-Type: text/html;charset=utf-8& ...
- HDU - 1260 (Tickets)
题意: 买票 一个人要么自己买 要么和前面的人一起买 这两种情况分别有一个买票所花费的时间 求总的花费时间最小 解析: dp[i] 表示前i个人买票总的花费时间 v[i]表示第i个人买 ...
- Threed.sleep是不会释放锁,而wait是释放锁的(对象锁)
实战分析 一直都说,Threed.sleep是不会释放锁,而wait是释放锁的(对象锁),现理论上来分析一下啊. v package thread.concurrent; public class D ...
- [luogu3455][POI2007]ZAP-Queries【莫比乌斯反演】
题目描述 FGD正在破解一段密码,他需要回答很多类似的问题:对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a,y<=b,并且gcd(x,y)=d.作为FGD的同学,FGD希望得 ...
- 【ZJOI 2019】麻将(dp of dp)
这是我第一次写$dp \; of \; dp$,大致思路参考了xyx的做法,可能有些地方不太一样,但也许会详细一点. 考虑给你一副牌,如何判断这副牌是否是胡的. 容易发现相同的顺子不会选三个以上,于是 ...
- tf 常用函数 28原则
一个tensorflow图由以下几部分组成: 占位符变量(Placeholder)用来改变图的输入. 模型变量(Model)将会被优化,使得模型表现得更好. 模型本质上就是一些数学函数,它根据Plac ...
- PendingIntent的使用
1, 构造intent Intent mIntent = new Intent("android.intent.action.MAIN"); ComponentName comp ...
- Android:更好的自定义字体方案
http://ryanhoo.github.io/blog/2014/05/05/android-better-way-to-apply-custom-font/ 情景 解决方案 1)Android默 ...
- hdu 2586(裸LCA)
传送门 题意: 某村庄有n个小屋,n-1条道路连接着n个小屋(无环),求村庄A到村庄B的距离,要求是经过任一村庄不超过一次. 题解: 求出 lca = LCA(u,v) , 然后答案便是dist[u] ...
- 谨记:new Date()在IOS中的坑
第一次遇到,记录一下 要创建一个指定时间的new Date对象时,通常的做法是: new Date("2018-04-27 11:11");然后就可以根据这个获取年月日等信息 这种 ...