希尔排序是否适合单链表结构的数据?

Jo_huang 2015-11-28 04:14:11
普通的插入排序在链表上还是比较好实现的,而希尔排序需要隔一大段距离取下一个数据的指针,如果每次都要逐个遍历效率实在很慢,为什么我看到很多地方都说适合链表的排序有希尔排序?但是我在网上搜链表的希尔排序找到的资料又很少,找到一个实现代码:
http://blog.csdn.net/huhao_bupt/article/details/5389892
可是正如我前面说的,每次都要重新遍历效率太低。

另外,快速排序为什么又不适合单链表结构呢?每次遍历的时候把大于哨兵的元素连成一个子链表,小于哨兵的连成另一个子链表,最后再头尾相连就可以了,这样效率跟数组也差不多,为什么都说不适合呢?
...全文
841 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jo_huang 2015-11-30
  • 打赏
  • 举报
回复
引用 6 楼 lm_whales 的回复:
[quote=引用 4 楼 huang1433 的回复:] [quote=引用 3 楼 lm_whales 的回复:] 似乎链表排序,多半都是忽略查找位置这一类操作的, 也就是认为 排序的其他操作比这个寻位操作耗时,于是可以认为不是基本操作
额。。。如果这样那还有什么适不适合的[/quote] 另外如果实现上比较巧妙,可以达到,寻位操作总和是 O(N) 那么,对于排序来说,也是合适的 毕竟排序是O(NlogN)这种级别的 谢尔排序是 O(N ^(1+a)) 0< a <1 级别的。都比 O(N)耗时[/quote] 谢谢你回复了这么多,不过按照我1楼给的链接的实现方法,平均寻位操作的级别得O(N*N ^(1+a)) 0< a <1, 因为对每一个间隔h,都需要遍历(N-h)+(N-h+1)+(N-h+2)....+N =(N-h/2)*N(最坏情况下) 而总共有logN个h,这个额外损耗实在有点多。
lm_whales 2015-11-29
  • 打赏
  • 举报
回复
如果O(NlogN) 的寻位,也勉强合适
lm_whales 2015-11-29
  • 打赏
  • 举报
回复
引用 4 楼 huang1433 的回复:
[quote=引用 3 楼 lm_whales 的回复:] 似乎链表排序,多半都是忽略查找位置这一类操作的, 也就是认为 排序的其他操作比这个寻位操作耗时,于是可以认为不是基本操作
额。。。如果这样那还有什么适不适合的[/quote] 另外如果实现上比较巧妙,可以达到,寻位操作总和是 O(N) 那么,对于排序来说,也是合适的 毕竟排序是O(NlogN)这种级别的 谢尔排序是 O(N ^(1+a)) 0< a <1 级别的。都比 O(N)耗时
lm_whales 2015-11-29
  • 打赏
  • 举报
回复
只有插入排序,不需要指定位置寻找,所以插入排序,很适合链表,
Jo_huang 2015-11-29
  • 打赏
  • 举报
回复
引用 3 楼 lm_whales 的回复:
似乎链表排序,多半都是忽略查找位置这一类操作的, 也就是认为 排序的其他操作比这个寻位操作耗时,于是可以认为不是基本操作
额。。。如果这样那还有什么适不适合的
lm_whales 2015-11-28
  • 打赏
  • 举报
回复
似乎链表排序,多半都是忽略查找位置这一类操作的, 也就是认为 排序的其他操作比这个寻位操作耗时,于是可以认为不是基本操作
Jo_huang 2015-11-28
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
链表不支持随机访问元素,决定了其排序速度肯定低于数组,可以参看STL中实现的源码
这个我知道,所以适合链表排序的当然是不需要随机读写的,比如插入排序,问题是我看到很多人说有适合链表的希尔排序,不知道具体怎么实现的,是否有针对链表作了相应的调整。
paschen 2015-11-28
  • 打赏
  • 举报
回复
链表不支持随机访问元素,决定了其排序速度肯定低于数组,可以参看STL中实现的源码
精心整理史上最全的数据结构flash演示动画,共5个版本,祝大家考研成功! \数据结构flash演示\版本1 \数据结构flash演示\版本2 \数据结构flash演示\版本3 \数据结构flash演示\版本4 \数据结构flash演示\版本5 \数据结构flash演示\版本1\1-4 算法和算法分析 冒泡排序.swf \数据结构flash演示\版本1\10-1-1插入排序.swf \数据结构flash演示\版本1\10-2-2直接插入排序.swf \数据结构flash演示\版本1\10-2-3折半插入排序.swf \数据结构flash演示\版本1\10-2-4-1直接插入排序.swf \数据结构flash演示\版本1\10-2-4表插入排序.swf \数据结构flash演示\版本1\10-2-5希尔排序.swf \数据结构flash演示\版本1\10-3-1起泡排序.swf \数据结构flash演示\版本1\10-3-2起泡排序.swf \数据结构flash演示\版本1\10-3-4快速排序.swf \数据结构flash演示\版本1\10-4-2堆排序大顶堆.swf \数据结构flash演示\版本1\10-4-3堆排序大顶堆.swf \数据结构flash演示\版本1\10-4-4堆排序建立堆.swf \数据结构flash演示\版本1\10-5-2归并排序.swf \数据结构flash演示\版本1\10-6-1多关键字排序.swf \数据结构flash演示\版本1\10-6-2分配收集.swf \数据结构flash演示\版本1\10-6-3分配收集2.swf \数据结构flash演示\版本1\10-6-4计数排序.swf \数据结构flash演示\版本1\2-2-1顺序表的查找.swf \数据结构flash演示\版本1\2-2-2顺序表的插入演示.swf \数据结构flash演示\版本1\2-2-3顺序表的插入算法.swf \数据结构flash演示\版本1\2-2-4顺序表的删除演示.swf \数据结构flash演示\版本1\2-2-5顺序表的删除算法.swf \数据结构flash演示\版本1\2-2-6.swf \数据结构flash演示\版本1\2-2-7.swf \数据结构flash演示\版本1\2-2-8.swf \数据结构flash演示\版本1\2-2-9.swf \数据结构flash演示\版本1\2-3-1.1单链表删除节点.swf \数据结构flash演示\版本1\2-3-1.2单链表插入节点.swf \数据结构flash演示\版本1\2-3-1单链表getElem.swf \数据结构flash演示\版本1\2-3-2单链表头插法.swf \数据结构flash演示\版本1\2-3-3.swf \数据结构flash演示\版本1\2-3-4.swf \数据结构flash演示\版本1\2-3-5带头结点的双向循环链表.swf \数据结构flash演示\版本1\2-3-6双向链表的插入.swf \数据结构flash演示\版本1\2-3-7双向链表的删除.swf \数据结构flash演示\版本1\2-3-8.swf \数据结构flash演示\版本1\2-3-9两个有序链表的连接.swf \数据结构flash演示\版本1\3-2-1栈的应用举例-进制转换.swf \数据结构flash演示\版本1\3-3-10链队列.swf \数据结构flash演示\版本1\3-3-11链队列-入队.swf \数据结构flash演示\版本1\3-3-12-1链队列出队.swf \数据结构flash演示\版本1\3-3-12-2链队列出队-队列空.swf \数据结构flash演示\版本1\3-3-13循环队列.swf \数据结构flash演示\版本1\3-3-1栈的应用举例-走迷宫-有解.swf \数据结构flash演示\版本1\3-3-2栈的应用举例-走迷宫-无解.swf \数据结构flash演示\版本1\3-3-4后缀式.swf \数据结构flash演示\版本1\3-3-5后缀式.swf \数据结构flash演示\版本1\3-3-6后缀式.swf \数据结构flash演示\版本1\3-3-7后缀式.swf \数据结构flash演示\版本1\3-3-9栈的应用举例-汉诺塔.swf \数据结构flash演示\版本1\3-4-1杨辉三角.swf \数据结构flash演示\版本1\3-4-2离散事件模拟.swf \数据结构flash演示\版本1\4-1-1串的定位操作.swf \数据结构flash演示\版本1\4-1-2串的替换.s
数据结构与算法(Python) 一、引入概念 1-01算法引入 1-02 时间复杂度与大O表示法 1-03-最坏时间复杂度与计算规则 1-04-常见时间复杂度与大小关系 1-05-代码执行时间测量模块 1-06-Python列表类型不同操作的时间效率 1-07-Python列表与字典操作的时间复杂度 1-08-数据结构引入 二、顺序表 2-01 内存、类型本质、连续存储 recv 2-02 基本顺序表与元素外围顺序表 recv 2-03 顺序表的一体式结构与分离式结构 recv 2-04 顺序表数据区替换与扩充 recv 三、栈 3-01 栈与队列的概念 3-02 栈的实现 3-03 队列与双端队列的实现 四、链表 4-01 链表的提出 4-02 单链表的ADT模型 4-03 Python中变量标识的本质 4-04 单链表及结点的定义代码 4-05 单链表的判空、长度、遍历与尾部添加结点的代码实现 4-06 单链表尾部添加和在指定位置添加 4-07 单链表查找和删除元素 4-08 单链表与顺序表的对比 4-09 单向循环链表遍历和求长度 4-10 单向循环链表添加元素 4-11 单向循环链表删除元素 4-12 单向循环链表删除元素复习及链表扩展 4-13 双向链表及添加元素 4-14 双向链表删除元素 五、排序与搜索 5-01 排序算法的稳定性 5-02 冒泡排序及实现 5-03 选择排序算法及实现 5-04 插入算法 5-05 插入排序 5-06 插入排序2 5-07 希尔排序 5-08 希尔排序实现 5-09 快速排序 5-10 快速排序实现1 (1) 5-10 快速排序实现1 5-11 快速排序实现2 5-12 归并排序 5-13 归并排序 代码执行流程 5-14 归并排序时间复杂度及排序算法复杂度对比 5-15 二分查找 5-16 二分查找时间复杂度 六、树和树的算法 6-01 树的概念 6-02 二叉树的概念 6-03 二叉树的广度优先遍历 6-04 二叉树的实现 6-05 二叉树的先序、中序、后序遍历 6-06 二叉树由遍历确定一棵树 ———————————————— 版权声明:本文为CSDN博主「dwf1354046363」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/dwf1354046363/article/details/119832814

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧