- 1、本文档共20页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第二十一讲 排序
——希尔排序、堆排序
冒泡排序、简单选择排序、直接插入排序等
2
简单排序方法的平均时间复杂度均为O(n )
2
排序算法时间复杂度能否低于O(n ) ?
Donald L. Shell (1924.3-2015.11 )
1959年提出了一个缩小增量排序方法,突破
2
了排序算法O(n )的时间复杂度
后被命名为希尔排序
希尔排序——对直接插入排序的改进
直接插入排序
第i趟用r[0]表示待插入记录r[i+1],将前i个已
排好序的记录中比r[0]大的记录依次后移一个单
元,将r[0]插入空出的位置
下标 0 1 2 3 4 5 6 7 8 9
r 3 1 5 8 9 3 7 4 6 2
void InsertSort( SqList L) //直接插入排序
{
int i, j;
for(i=2; i<L.length; i++) // 将L.r[i]插入有序子表r[1]…r[i-1]
{
if ( L.r[i]<L.r[i-1] )
{
L.r[0] = L.r[i]; // 待插入记录暂存于r[0]
for ( j = i-1; L.r[j] > L.r[0]; j--) // 将所有大于r[0]的记录逐一后移
L.r[j+1] = L.r[j];
L.r[j+1] = L.r[0]; // 将r[i] 插入到合适位置
}
}
2
} 时间复杂度最好为O(n),最坏O(n )
适合n较小或初始序列基本有序的情况
改进思路
分组进行
每组的记录个数较少,组内排序较快
基本有序后采用直接插入,需要移动的次数有限
如何分组?
每隔一定数量h (增量)取一个记录组成子序列
排序时记录会跳跃式移动
逐步缩小增量h至1
例L = {49,38,65,97,76, 13, 27, 49, 55, 4}
希尔排序V.S. 直接插入排序 注:只计算记
录后移次数
希尔排序 初始: 49 38 65 97 76 13 27 49 55 4
取h=5 一趟分组: 移动5次
一趟排序:
13 27 49 55 4 49 38 65 97 76
取h=3 二趟分组: 移动2次
二趟排序:13 4 49 38 27 49 55 65 97 76
移动5次
三趟排序:
文档评论(0)