首页
编程星球
啊哈磊的小伙伴
求助
交流
添柴
挑战
题库
院校合作
加入圈子
扫码关注啊哈磊
QQ群:703568346
@啊哈编程星球
暑期课程
金牌教练带你玩转编程!
扫码预约课程
未登录
我的添柴
退出账号
搜索
搜索
本版
文章
帖子
用户
啊哈磊_编程从这里起步
»
交流
›
啊哈
›
我也来八一八算法
›
单链表线性表的插入排序算法
返回列表
发新帖
查看:
2247
|
回复:
3
单链表线性表的插入排序算法
[复制链接]
巧若拙
巧若拙
当前离线
积分
83
电梯直达
楼主
发表于 2014-9-17 14:49:07
|
只看该作者
|
倒序浏览
|
阅读模式
最近看《啊哈,算法》,写了一个对单链表线性表进行插入排序的算法,其中用到一个小技巧,不用定位插入位置的前驱结点,自我感觉很巧妙,大家评评看。
typedef int ElemType;
typedef int Status; //函数类型,其值是函数结果状态代码,如OK等
typedef struct Node{
ElemType data;//数据域
struct Node *next;//指针域
} Node;
typedef struct Node *LinkList;
/*
函数功能:给单链表线性表排序
初始条件:单链表线性表L已经存在,该线性表带一个不存储信息的头结点;
操作结果:使用插入排序的方法,为单链表线性表排序。
操作成功返回OK,否则返回ERROR
*/
Status ListSort(LinkList *L)
{
ElemType temp;
LinkList q, p, pos = (*L)->next; //p指向第1个结点
if (!pos)
{
printf("空表!");
return ERROR;
}
while (pos->next != NULL)//寻找最后一个结点
{
pos = pos->next;
}
while ((*L)->next != pos)
{
q = (*L)->next;
(*L)->next = q->next;
p = pos;
while (p->next != NULL && p->data < q->data) //寻找插入点
{
p = p->next;
}
q->next = p->next; //在p后插入q
p->next = q;
if (p->data > q->data) //若p的值大于q,交换二者的值,以保证线性表有序
{
temp = p->data;
p->data = q->data;
q->data = temp;
}
}
return OK;
}
楼主新帖
最短路径算法集锦
史上最简明易懂非递归遍历二叉树算法
算法进化历程之“快速排序”
算法进化历程之“归并排序”
我想加入添柴-编程学习网,需要邀请码
楼主热帖
我想加入添柴-编程学习网,需要邀请码
最短路径算法集锦
史上最简明易懂非递归遍历二叉树算法
算法进化历程之“归并排序”
算法进化历程之“快速排序”
收藏
0
转播
分享
回复
举报
rosynirvana
rosynirvana
当前离线
积分
7454
沙发
发表于 2014-9-17 17:17:58
|
只看该作者
你自己试验过这段代码吗?
while (pos->next != NULL)//寻找最后一个结点
{
pos = pos->next;
}
……
p = pos;
while (p->next != NULL && p->data < q->data)
pos指向链表最后一个节点,p=pos,然后还要验证p->next != NULL ?
如果如你所说“不用定位插入位置的前驱结点”,但是你用了(*L), pos, p, q,4个指针,也没有什么优势
回复
支持
反对
举报
巧若拙
巧若拙
当前离线
积分
83
板凳
楼主
|
发表于 2014-9-18 10:42:10
|
只看该作者
测试过的。
pos在排序开始的时候是指向最后一个结点的,但后来随着不断插入新结点,pos就不是指向最后一个结点了,而是指向有序链表的第一个结点,即pos及其后面的结点是有序的。
回复
支持
反对
举报
巧若拙
巧若拙
当前离线
积分
83
地板
楼主
|
发表于 2014-9-18 10:45:08
|
只看该作者
算法的巧妙之处在于即使结点数据比pos->data大,也是在pos后面插入,通过交换数据值来确保链表有序。
否则要遍历链表去寻找pos的前驱结点,时间复杂度变大了。
回复
支持
反对
举报
返回列表
发新帖
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
浏览过的版块
学习求助
讨论
资料/作品分享
啊哈C语言教程和编译器
广播台
特别关注
快速回复
返回顶部
返回列表