排序——希尔排序

举报
ruochen 发表于 2021/03/26 00:08:15 2021/03/26
【摘要】 希尔排序(基于逐趟缩小增量)基本思想算法实现算法分析 希尔排序(基于逐趟缩小增量) 基本思想 先将整个待排记录序列分割成若干子序列,分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。 算法实现 void ShellSort(SqList &L, int dlta[], int t){ //...

希尔排序(基于逐趟缩小增量)

基本思想

  • 先将整个待排记录序列分割成若干子序列,分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。
    在这里插入图片描述

算法实现

void ShellSort(SqList &L, int dlta[], int t){
	// 按增量序列dlta[0…t-1]对顺序表L作Shell排序
	for(k = 0; k < t; k++)
		ShellInsert(L, dlta[k]);  // 增量为dlta[k]的一趟插入排序

}

void ShellInsert(SqList &L, int dk){
	// 对顺序表L进行一趟增量为dk的Shell排序,dk为步长因子
	for(i = dk + 1; i <= L.length; i++){
		// 开始将r[i] 插入有序增量子表
		if(r[i].key < r[i - dk].key){ r[0] = r[i];  // 暂存在r[0] for(j = i - dk; j > 0 && (r[0].key < r[j].key); j = j - dk) r[j + dk] = r[j];  // 关键字较大的记录在子表中后移 r[j + dk] = r[0];  // 在本趟结束时将r[i]插入到正确位置
		}
	}
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

算法分析

  • 时间复杂度: O(n3/2)
  • 空间复杂度为 O(1)
  • 稳定性: 不稳定

如何选择最佳的序列,目前尚未解决
最后一个增量值必须为1,无除1以外的公因子
不宜在链式存储结构上实现

文章来源: ruochen.blog.csdn.net,作者:若尘,版权归原作者所有,如需转载,请联系作者。

原文链接:ruochen.blog.csdn.net/article/details/103802725

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。