Michael_lcf 2021-06-19 18:59 采纳率: 0%
浏览 176

希尔排序的增量及趟数确定问题

//对顺序表L做一趟希尔插入排序。
//本算法是和一趟直接插入排序相比,做了如下修改:
//1、前后记录位置的增量是dk,而不是1;
//2、r[0]只是暂存单元,不是哨兵。当j<=0时,插入位置已找到。
void ShellInsert(SqList &L, int dk) {
	for(int i=dk+1; i<=L.length; ++i) {
		if(L.r[i].key < L.r[i-dk].key) {//需将 L.r[i] 插入有序增量子表
			L.r[0] = L.r[i];//暂存在 L.r[0]
			int j;
			for(j=i-dk; j>0 && (L.r[0].key < L.r[j].key); j-=dk) {
				L.r[j+dk] = L.r[j];//记录后移,查找插入位置
			}
			L.r[j+dk] = L.r[0];//插入
		}
	}
}
//按增量序列 dlta[0 .. t-1]对顺序表L做希尔排序
//SqList &L  
//int dlta[]  增量序列
//int t		  排序趟数
void ShellSort(SqList &L, int dlta[], int t) {
	for(int k=0; k<t; ++t){
		ShellInsert(L, dlta[k]);//一趟增量为dlta[k]的插入排序
	}
}

希尔排序的增量及趟数怎么确定?怎么调用?有点蒙啊?

  • 写回答

1条回答 默认 最新

  • 「已注销」 2023-03-16 18:06
    关注

    参考GPT和自己的思路:

    希尔排序的增量及趟数需要根据具体情况来确定,通常采用一些经验公式来计算增量序列,如Hibbard增量序列、Sedgewick增量序列等。同时,趟数也需要根据具体情况进行调整。一般来说,希尔排序的时间复杂度与增量序列有关,有些增量序列可以使得排序时间复杂度接近于O(n log n)。

    对于上述代码中的ShellSort函数的调用,需要传入一个SqList类型的顺序表L,以及一个增量序列dlta和排序趟数t的数组,然后通过调用ShellInsert函数对L进行希尔排序,其中ShellInsert函数为对顺序表L进行一趟希尔插入排序的函数。

    评论

报告相同问题?

悬赏问题

  • ¥50 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?