- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
简单选择排序算法稳定性剖析及其改进
简单选择排序算法稳定性剖析及其改进
摘要摘要:稳定性是度量排序算法质量的一个重要指标。简单选择排序是一种常见的排序算法,但其稳定性存在较大争议。结合实例探讨经典简单选择排序算法稳定性,并进行改进,在时间复杂度和空间复杂度不变的前提下,提出一种稳定的简单选择排序算法。
关键词关键词:算法设计;排序算法;选择排序;算法稳定性
DOIDOI:10.11907/rjdk.1511569
中图分类号:TP301.6
文献标识码:A文章编号文章编号2016)002006003
0引言
排序算法的稳定性是度量排序算法质量的一个重要指标,指两条关键字相等的记录R、S在排序前与排序后应该保持次序上的先后关系不变。简单选择排序简单易懂,但其稳定性存在争议。大部分常见排序算法在是否满足稳定性方面都有明确的结论。例如,直接插入排序、折半插入排序、冒泡排序、树形选择排序、归并排序、基数排序等都是稳定的排序算法;而希尔排序、快速排序、堆排序等是不稳定的。
文献[1]在选择排序的专题内容中给出的简单选择排序算法是不稳定的,但是进行内部排序方法比较时所有时间复杂度为平方级的简单排序方法都是稳定的。文献[1]指出,选择排序方法本身是一种稳定的排序方法,但经典的简单排序算法却表现出不稳定现象,是由于经典算法采用了交换记录的策略,适当改变该策略就可以得到一个稳定的简单选择排序算法。但是,如何调整经典选择排序的交换策略,文献[1]中并没有给出具体方法。常见程序设计、数据结构以及算法方面的教材中对简单选择排序算法的稳定性问题也都缺乏深入完整的讨论[23]。文献[4]指出经典选择排序算法是不稳定的,同时给出了一个改进的简单选择排序算法以保证稳定性。但文献[5]所提方法提高了经典选择排序算法的空间复杂度。本文在不改变简单选择排序时间复杂度和空间复杂度的前提下,对简单选择排序算法进行改进,提出一种稳定的同等复杂度的简单选择排序算法。
1简单选择排序算法及其性能分析
1.1经典简单排序算法
设待排序记录数组为R[1...n],对其按照关键字key由小到大进行排序。经典的简单选择排序算法思想为:将排序过程分为n趟,第一趟从R[1]开始,通过n-1次比较,从所有n条记录中选出关键字最小的记录,记为R[IndexOfMin],交换R[1]和R[IndexOfMin];第二趟从R[2]开始,通过n-2次比较,从第2条到最后一条共n-1条记录中选出关键字最小的记录,同样记为R[IndexOfMin],交换R[2]和R[IndexOfMin];以此类推,上述过程重复n-1趟,完成排序。经典简单选择排序算法C语言伪代码如下:
void SelectSort(RcdType R[], int length)
//R是存放待排序记录的数组,记录从1号元素开始存放,length标识待排序记录个数
//假设由小到大进行排序
{
for(i=1; ilength; ++i)
{
IndexOfMin=i;
for(j=i+1; j=length,++j)
if(R[j].key R[IndexOfMin].key )
IndexOfMin=j;
if(IndexOfMin!=i)
{
temp=R[i];
R[i]=R[IndexOfMin];
R[IndexOfMin]=temp;
}
}
}
1.2简单选择排序算法复杂度分析
简单选择排序过程基本操作分为比较、交换两类。排序过程中,需要进行的记录移动次数较小。当原始记录按照所要求顺序排列时,交换次数为0;当原始记录排序顺序与要求顺序相反时,交换次数最多达到(n-1)次,对应的赋值次数为3(n-1)。就比较次数而言,无论原始序列是何种情况,第1趟排序过程中需要比较n-1次,第2次需比较n-2次;以此类推,第i次需要比较n-i次,最后一趟比较1次。因此,总的比较次数为 n*(n-1)/2。由此可知,简单选择排序算法的总时间复杂度为O(n2)。
就空间复杂度而言,由上述简单选择排序伪代码可见,无论待排序记录有多少条,简单选择排序算法只有i、j、IndexOfMin和temp四个辅助变量。因此,简单选择排序算法的空间复杂度是常数阶的,空间复杂度为O(1)。
1.3稳定性分析
结合实例说明经典简单选择排序算法是不稳定的。假设:将以下序列从小到大排序,3, 3*,3**,2(当中, *用来区分关键字相同的不同记录)。按照经典的简单选择排序,当i=1执行第一次循环时,最小记录为最后一条记录2,它对应的下标IndexOfMin取值为4。此
原创力文档


文档评论(0)