当前位置:首页 » 操作系统 » 单链表排序算法

单链表排序算法

发布时间: 2022-07-04 00:27:02

⑴ 单链表的简单排序

最简单的选择排序具体看代码:

#include<cstdio>
#include<cstdlib>
#include<ctime>
structnode{
intval;
node*next;
node(intv):val(v),next(NULL){}
};
//从小到大,最简单的选择排序
node*linklist_sort(node*head){
node*nhead=newnode(0);
while(true){
node*temp=head,*maxpre=head;
for(;temp->next;temp=temp->next){
if(temp->next->val>maxpre->next->val){
maxpre=temp;
}
}
if(temp==head)break;
temp=maxpre->next;
maxpre->next=temp->next;
temp->next=nhead->next;
nhead->next=temp;
}
head->next=nhead->next;
returnhead;
}
voidtraval(node*head){//遍历单链表
while(head->next){
printf("%d",head->next->val);
head=head->next;
}
printf(" ");
}
intmain(){
srand(time(NULL));
node*head=newnode(0);
for(inti=0;i<10;i++){
node*t=newnode(rand()%1000);
t->next=head->next;
head->next=t;
}
traval(head);
head=linklist_sort(head);
traval(head);
return0;
}

⑵ 单链表排序算法分析

for(q=p->next;q;q=q->next) 因为每一步都要从p开始,与后面所有结构体进行比较,所以q作为这一次比较的指针,下次又从p开始,直至p为空

small=q; /*执行这句之后又回到for(q=p->next;q;q=q->next) 直到本次比较结束

temp=p->data;
p->data=small->data; 把本次找到的最小值与头结点值进行交换,还差一句:small->data=temp;

⑶ 对单链表中的数据进行排序,用哪种算法比较好

typedef struct __LINK
{
int data;
struct __LINK *next;
} LinkNode_t;

//冒泡排序单连表, 交换值方式
bool LinkSort( LinkNode_t* &head )
{
assert( head != NULL );
bool change = true;
LinkNode_t* p = head;
LinkNode_t* pStop = head->next;
int ifirst = 0;

while ( pStop && pStop->next )
{
pStop = pStop->next;
}

LinkNode_t* pFlag = head;

while ( change )
{
change = false;
for ( p = head->next; p != pStop; p = p->next )
{
if ( p->data < p->next->data )
{
int value = p->data;
p->data = p->next->data;
p->next->data = value;
change = true;
}
if ( p->next == pStop ) pFlag = p;
}
pStop = pFlag;
}
return true;
}

⑷ 以单链表为存储结构,编写简单选择排序算法(需预先创建符合要求的单链表)

选择排序:从头至尾扫描序列,找出最小的一个元素,和第一个元素交换,接着从剩下的元素中继续这种选择和交换方式,最终得到一个有序序列。

出这题的人是个坑货,链表交换很麻烦。
每次遍历找最小值时候 还要用一个指针定位到它前面一个, 才好交换。

⑸ 单链表的直接插入排序的算法。问题

一开始head->next=NULL;与q=head->next;表示将头指针与后面的链表完全断开,然后p就是后面链表的第一个结点,第一个while就是用来判断后面的那个链表是否有剩,然后q表示head的下一个结点,因为第一次操作head下一个是空的,所以第二个while跳出来,后面链表首结点下一个指向head的下一个即空,head下一个变成后面链表首结点,总的说就是把后面链表的首结点插到head的后面,之后p=pre来使后面链表首结点向后移。后面的操作也是一样,不过经过第一轮操作后,head后面已经有了结点,所以第二轮操作需要第二个while来控制应该插在哪里

⑹ 单链表的排序算法,哪位大师麻烦您说一哈,感激不尽!

这个比较恶心,最好使用插入排序的方式,效率稍微高点。先对数组排序实现一个插入排序,代码不多,可以写一个。然后就按照那种思想,将链表节点拿出来插入到正确位置。

后来是刷题刷到的一个题目吧,好像是使用快慢指针的方式,采用归并排序,性能算nlgn吧。这个算法分为以下三步,

  1. 利用快慢指针找到链表的中间节点,O(n/2)

  2. 分别执行n/2长度的归并算法,2*T(n/2)

  3. 对两段归并的结果进行merge,O(n)

T(n) = O(n/2) + 2*T(n/2) + O(n)

上面的这个公式的时间复杂度是O(n*lgn)

热点内容
hp存储扩容 发布:2024-11-17 23:29:16 浏览:569
在ftp中put表示什么 发布:2024-11-17 23:29:12 浏览:383
mvc多文件上传 发布:2024-11-17 23:13:56 浏览:155
玩游戏硬盘缓存32m 发布:2024-11-17 23:03:42 浏览:525
蓝光存储系统 发布:2024-11-17 23:03:41 浏览:436
地平线4提示配置低于最低怎么办 发布:2024-11-17 22:54:38 浏览:610
注册银行卡账户密码填什么 发布:2024-11-17 22:54:35 浏览:537
java压缩上传图片 发布:2024-11-17 22:26:59 浏览:627
plc编程课件 发布:2024-11-17 22:18:23 浏览:469
我的世界服务器信号一直在检测 发布:2024-11-17 22:09:52 浏览:547