单链表排序的时间复杂度是什么?单链表上难以实现的排序方法

:暂无数据 2026-03-26 15:20:01 0
本文旨在解决您关于单链表排序的两大困惑:一是理清基本概念,二是深入解析单链表排序的时间复杂度是什么。内容干练,直奔主题。

本文目录

单链表排序的时间复杂度是什么

o(NlogN),虽然不是所有的高级排序算法都适用于单链表,但是还是部分适用的,比如归并排序,希尔排序,和快速排序的特定实现。

就算这些算法你统统不考虑,还有一种简单粗暴的方法:

  1. 将链表复制到数组

  2. 排序数组 

  3. 将数组还原成链表

这三步的复杂度是O(n+nlogn+n)= O(nlogn)

单链表上难以实现的排序方法

单链表上难以实现的排序方法是快速排序。根据查询相关公开信息显示,单链表上难以实现的排序方法是快速排序法,包括堆排序和希尔排序,使用数组制作的静态树,使用单链表进行该算法。

单链表排序问题

#include 《iostream》
#include 《ctime》
#define ERROR 0;
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
//建立链表L2,顺序插入
//输入:1,2,3,4。输出1,2,3,4
void CreateList_L2(LinkList &L,int n)
{ int i;
L=(LinkList)malloc(sizeof(LNode));
L-》data=n; L-》next=NULL;
LinkList p,q;
//q=(LinkList)malloc(sizeof(LNode));
q=L;
for(i=n;i》0;i--)
{
p=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p-》data);
q-》next=p;
p-》next=NULL;
q=p;
}//for
}//CreateList_L2
//按顺序打印链表
void print(LinkList L)
{ LinkList p;
p=L-》next;
while(p!=NULL)
{ printf("\t%d",p-》data);
p=p-》next;
}//while
}//print
//链表排序,非递减顺序排列
void Listsort_L(LinkList &L)
{
LinkList p,q;
ElemType temp;
for(p=L-》next;p!=NULL;p=p-》next)
{

for(q=p-》next;q!=NULL;q=q-》next)
{

if(p-》data》q-》data)
{

temp=p-》data;
p-》data=q-》data;
q-》data=temp;
}

}

}
}
void main()
{
int n;
LinkList L;
printf("how many numbers you want to input in L:");
scanf("%d",&n);
CreateList_L2(L,n);
Listsort_L(L);
printf("排序后的L是:");
print(L);
}

有一个带头结点的单链表L,设计一个算法使其元素递增有序排列

/* 插入排序法 */
void sort(Linklist *&L)
{
    LinkList *p=L-》next, *q, *r;
    if(p!=NULL)
    {
        /* 把链表分成两条,一条已经排序好了(L),一条待排序(p)*/
        r=p-》next;
        p-》next=NULL;
        p=r;
        /* 对于所有待排序的元素 */
        while(p!=NULL)
        { 
            /*把p链表的第一个元素插入到L,并且将它从p中移除*/
            r=p-》next;  //r指向p的第二个元素
            /* 找到合适的插入点 */
            q=L;
            while(q-》next!=NULL && q-》next-》data 《 p-》data)
                q=q-》next;
            /* 在q后面插入p */
            p-》next=q-》next;
            q-》next=p;
            /* 现在p的第一个元素已经被移到L中合适的位置了 */
            p=r;
        }
    }
}

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

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;
}

一单链表中元素无序,编写算法将之排成有序序列

    由冒泡排序得到启示,每趟均从头节点开始扫描,比较相邻两节点的数据,
满足特定要求时进行节点交换。
    需要注意的是,必须有一个指针保存当前节点的前一个位置,这样在交换
节点后链表不会断开;并且要指定一个哨兵节点作为每趟比较的终结点,该哨
兵节点实际上就是有序区的首节点。
struct Node {
    int data;
    Node *next;
};
/* 因为排序后头结点指针可能发生改变,所以参数是二级指针 */
void listSort(Node **head)
{
    if(head == NULL || *head == NULL)
        return;
   
    Node *cur, *post, *pre, *sentinel = NULL;  // sentinel 标记有序区的首个节点
    bool sorted;
   
    do {
        pre = NULL;
        cur = *head;
        sorted = true;
       
        /* 反复用当前节点 cur 与下一个节点 post 进行比较 */
        while((post = cur-》next) != sentinel) { 
            if(cur-》data 》 post-》data) { 
                sorted = false;  // 发生交换,则仍未有序
                cur-》next = post-》next;
                post-》next = cur;
               
                if(pre != NULL)
                    pre-》next = post;
                pre = post;
                
                if(cur == *head)
                    *head = post;  // 保证头指针指向最小的节点
            } else {
                pre = cur;
                cur = post;
            }
        }
        sentinel = cur;  // cur 为该趟排好序的节点
    } while(!sorted);    // 若未发生交换,则已经有序
}

关于单链表排序和单链表排序的时间复杂度是什么的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
本文编辑:admin

更多文章:


router路由器登录网址(华硕路由器后台默认网址是多少)

router路由器登录网址(华硕路由器后台默认网址是多少)

其实router路由器登录网址的问题并不复杂,但是又很多的朋友都不太了解华硕路由器后台默认网址是多少,因此呢,今天小编就来为大家分享router路由器登录网址的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

2026年3月27日 22:20

inner join 重复数据(mysql数据库里只有一条数据为什么查询出来有两条重复的数据)

inner join 重复数据(mysql数据库里只有一条数据为什么查询出来有两条重复的数据)

大家好,如果您还对inner join 重复数据不太了解,没有关系,今天就由本站为大家分享inner join 重复数据的知识,包括mysql数据库里只有一条数据为什么查询出来有两条重复的数据的问题都会给大家分析到,还望可以解决大家的问题,

2026年3月27日 22:00

ideal是什么意思中文(ideal和idea的区别是什么)

ideal是什么意思中文(ideal和idea的区别是什么)

曾几何时,我也觉得ideal是什么意思中文高不可攀,尤其ideal和idea的区别是什么更是一头雾水。后来才发现,只是没找对方法,希望我的经验能帮到你。

2026年3月27日 21:40

学hadoop需要什么基础(学习Hadoop前提需要哪些)

学hadoop需要什么基础(学习Hadoop前提需要哪些)

我们注意到,那些在学hadoop需要什么基础上表现突出的人,往往都对学习Hadoop前提需要哪些有独到的见解。这并非巧合。

2026年3月27日 21:20

numpy安装了无法运行(python中numpy库中的matplotlib不能运行)

numpy安装了无法运行(python中numpy库中的matplotlib不能运行)

本篇文章给大家谈谈numpy安装了无法运行,以及python中numpy库中的matplotlib不能运行对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本

2026年3月27日 21:00

表格trim函数(excel表格中卡号数字后面的空格怎么一起删除)

表格trim函数(excel表格中卡号数字后面的空格怎么一起删除)

常言道:“万丈高楼平地起”。理解表格trim函数这座大厦,也必须从excel表格中卡号数字后面的空格怎么一起删除这块基石开始。

2026年3月27日 20:40

有趣的vbs小程序代码(vb有趣小程序)

有趣的vbs小程序代码(vb有趣小程序)

相信点开这篇文章的你,一定对有趣的vbs小程序代码抱有好奇。没关系,下面我们就结合vb有趣小程序,带你一步步揭开它的面纱。

2026年3月27日 20:20

of是什么意思翻译成中文(英语关于 of  的翻译)

of是什么意思翻译成中文(英语关于 of 的翻译)

各位老铁们,大家好,今天由我来为大家分享of是什么意思翻译成中文,以及英语关于 of 的翻译的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!

2026年3月27日 20:00

微信小程序商微信公众号制微信小程序开发制作(如何开发微信小程序微信宣传制作a)

微信小程序商微信公众号制微信小程序开发制作(如何开发微信小程序微信宣传制作a)

回顾我学习微信小程序商微信公众号制微信小程序开发制作的经历,如何开发微信小程序微信宣传制作a可算是一个重要的转折点。正是搞懂了它,一切才变得顺畅起来。

2026年3月27日 19:40

this is me英语自我介绍小海报(this is me英语手抄报简单)

this is me英语自我介绍小海报(this is me英语手抄报简单)

其实this is me英语自我介绍小海报的问题并不复杂,但是又很多的朋友都不太了解this is me英语手抄报简单,因此呢,今天小编就来为大家分享this is me英语自我介绍小海报的一些知识,希望可以帮助到大家,下面我们一起来看看这

2026年3月27日 19:20

最近更新

热门文章

delphi开源(什麼是delphi)
2026-03-27 06:40:01 浏览:0
stopdoing翻译(stop to do和stop doing的意思和区别)
2026-03-26 22:40:01 浏览:0
标签列表