首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

单链表C#中的基数排序

单链表是一种常见的数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。基数排序是一种非比较排序算法,它根据元素的位值将元素分配到不同的桶中,然后按照桶的顺序依次收集元素,最终得到有序的结果。

在C#中实现单链表可以使用自定义的节点类和链表类。节点类可以定义如下:

代码语言:txt
复制
public class ListNode
{
    public int Value { get; set; }
    public ListNode Next { get; set; }

    public ListNode(int value)
    {
        Value = value;
        Next = null;
    }
}

链表类可以定义如下:

代码语言:txt
复制
public class LinkedList
{
    private ListNode head;

    public LinkedList()
    {
        head = null;
    }

    public void Add(int value)
    {
        ListNode newNode = new ListNode(value);
        if (head == null)
        {
            head = newNode;
        }
        else
        {
            ListNode current = head;
            while (current.Next != null)
            {
                current = current.Next;
            }
            current.Next = newNode;
        }
    }

    public void Print()
    {
        ListNode current = head;
        while (current != null)
        {
            Console.Write(current.Value + " ");
            current = current.Next;
        }
        Console.WriteLine();
    }

    // 基数排序
    public void RadixSort()
    {
        if (head == null || head.Next == null)
        {
            return;
        }

        int maxDigit = GetMaxDigit();
        for (int i = 1; i <= maxDigit; i++)
        {
            ListNode[] buckets = new ListNode[10];
            ListNode current = head;
            while (current != null)
            {
                int digit = GetDigit(current.Value, i);
                if (buckets[digit] == null)
                {
                    buckets[digit] = current;
                }
                else
                {
                    ListNode tail = buckets[digit];
                    while (tail.Next != null)
                    {
                        tail = tail.Next;
                    }
                    tail.Next = current;
                }
                current = current.Next;
            }

            head = null;
            ListNode last = null;
            for (int j = 0; j < 10; j++)
            {
                if (buckets[j] != null)
                {
                    if (head == null)
                    {
                        head = buckets[j];
                    }
                    else
                    {
                        last.Next = buckets[j];
                    }
                    last = GetTail(buckets[j]);
                }
            }
            last.Next = null;
        }
    }

    // 获取链表中的最大位数
    private int GetMaxDigit()
    {
        int maxDigit = 0;
        ListNode current = head;
        while (current != null)
        {
            int digit = GetDigitCount(current.Value);
            if (digit > maxDigit)
            {
                maxDigit = digit;
            }
            current = current.Next;
        }
        return maxDigit;
    }

    // 获取一个数的指定位数上的数字
    private int GetDigit(int number, int digit)
    {
        return (number / (int)Math.Pow(10, digit - 1)) % 10;
    }

    // 获取一个数的位数
    private int GetDigitCount(int number)
    {
        if (number == 0)
        {
            return 1;
        }
        return (int)Math.Floor(Math.Log10(Math.Abs(number)) + 1);
    }

    // 获取链表的尾节点
    private ListNode GetTail(ListNode node)
    {
        ListNode tail = node;
        while (tail.Next != null)
        {
            tail = tail.Next;
        }
        return tail;
    }
}

使用示例:

代码语言:txt
复制
LinkedList list = new LinkedList();
list.Add(170);
list.Add(45);
list.Add(75);
list.Add(90);
list.Add(802);
list.Add(24);
list.Add(2);
list.Add(66);
list.Print(); // 输出:170 45 75 90 802 24 2 66
list.RadixSort();
list.Print(); // 输出:2 24 45 66 75 90 170 802

在腾讯云的产品中,可以使用云服务器(CVM)来进行服务器运维,使用云数据库(CDB)来进行数据库存储,使用云函数(SCF)来进行云原生应用开发,使用云存储(COS)来进行多媒体处理和存储,使用人工智能(AI)服务来进行音视频处理和物联网应用开发,使用区块链(BCBaaS)来构建区块链应用,使用腾讯云元宇宙(Tencent Real-Time Interactive Multimedia Platform,TRIM)来构建元宇宙应用。

相关产品和介绍链接如下:

  • 云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 云数据库(CDB):https://cloud.tencent.com/product/cdb
  • 云函数(SCF):https://cloud.tencent.com/product/scf
  • 云存储(COS):https://cloud.tencent.com/product/cos
  • 人工智能(AI):https://cloud.tencent.com/product/ai
  • 区块链(BCBaaS):https://cloud.tencent.com/product/baas
  • 腾讯云元宇宙(TRIM):https://cloud.tencent.com/product/trim

以上是关于单链表和基数排序的完善且全面的答案,希望能对您有所帮助。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

链表算法

这样数据单元叫做结点。 当多个结点通过指针指向,关联起来,就形成了一个链,即链表链表 链表可分为链表、双链表、循环链表。 本文先介绍链表链表就是沿着单方向链表。...首先让snext指针指向b,即s->next = p->next; 然后,让anext指针指向s,即p->next = s; 删除结点 假设要删除链表b结点。...] [1] destroyList, 销毁链表 [2] initList, 初始化一个带头结点链表,如果传入一个不为空链表,将被重置 [3] insertElem, 在链表第 i 个位置插入元素... elem [4] removeElem, 在链表移除第 pos 个元素,并由 elem 返回其值 [5] createList, 根据数组 elems 构建一个链表 [6] isEmptyList...\n"); } else { printf("The elem in pos(%d) is %d\n", pos, elem); } // 查找元素在链表第一次出现位置 elem = 4; pos

63390

链表应用

上篇博客,我们学习了链表,为了更加熟练掌握这一知识点,就让我们将链表应用操练起来吧! 203. 移除链表元素 - 力扣(LeetCode) 思路一:遍历原链表,将值为val节点释放掉。...环形链表约瑟夫问题_牛客题霸_牛客网 (nowcoder.com) 第一步 创建带环链表 第二部 遍历带环链表 /** * 代码类名、方法名、参数名已经指定,请勿修改,直接返回方法规定值即可...若pcur节点小于x,让它头插在新链表。 若pcur节点值大于或等于x,尾插。 思路三:创建新链表,小链表和大链表。 将小链表尾结点和大链表第一个有效节点首位相连。...,将原链表节点尾插到大小链表 ListNode*pcur=head; while(pcur) { if(pcur->val<x) {...尾结点next指针是否为空。 链表:不带头单向不循环 双向链表:带头双向循环

9510

链表应用

链表经典算法OJ题目 1.1 移除链表元素 #include typedef struct ListNode { int val; struct ListNode* next...,newTail为空;或者链表中都是同一个值,而正好删除是这个值,删完之后新链表newTail依然是空 { newTail->next = NULL; } return newHead;...代码重复根源在于链表可能会出现为空情况,那么我们就创建一个头节点(这里头就是带头链表头,是哨兵位,不存储有效数值),让链表不可能存在为空情况,就可以避免代码重复。...,将节点放到对应链表 ListNode* pcur = head; while (pcur) { if (pcur->val < x) { //放到小链表 lessTail...基于链表再实现通讯录项目 这里基于链表实现通讯录项目和之前基于顺序表实现通讯录项目的步骤大致相同,思路是相通,因此可以参考之前顺序表应用这篇文章。

6610

DS:链表实现

答案就是——链表!! 二、链表概念及结构 概念:链表是⼀种物理存储结构上非连续、非顺序存储结构,数据元素逻辑顺序是通过链表指针链接次序实现 。...如上图,顺序表在物理结构上是连续,即他们数据有在内存连续存放特点,但是链表物理结构是不连续,即他两个数据之间内存地址可能相差十万八千里。...三、链表结点结构体创建 通过结构体知识,我们要创建一个链表节点结构体,这其中需要包含自己数据,以及下一个结点地址。...四、链表实现 有了链表结点结构体,我们就可以去实现链表(single linked list)了。...NULL assert(*pphead);//保证链表不为空 //链表只有一个结点时候 if ((*pphead)->next == NULL)//->优先级大于* 所以要在*pphead上加括号

10710

链表问题】删除链表中间节点

【题目描述】 给定链表头节点head,实现删除链表中间节点函数。   ...例如:   步删除任何节点;   1->2,删除节点1;   1->2->3,删除节点2;   1->2->3->4,删除节点2;   1->2->3->4-5,删除节点3; 【要求】 如果链表长度为...(【链表问题】删除链表第K个节点) 其实也是可以使用双指针,但个人认为,那道题使用双指针方法并没有我上次那个做法优雅,而这次删除中间节点,则用双指针比较优雅。...问题拓展 题目:删除链表 a / b 处节点 【题目描述】   给定链表头节点 head、整数 a 和 b,实现删除位于 a/b 处节点函数。   ...例如:   链表:1->2->3->4->5,假设 a/b 值为 r。

83540

链表逆置

1 问题 如何实现链表数据进行逆置。...2 方法 方法一头插法:利用头插法重新建立带节点链表,逆置链表初始为空,表节点从原链表依此“删除”,在逐个插入逆置链表表头(即“头插”到逆置链表),使它成为逆置链表“新”第一个节点,如此循环...,直至原链表为空; 方法二递归:先假定有一个函数,可以将以head为头结点链表逆序,并返回新头结点。...利用这个函数对问题进行求解:将链表分为当前表头结点和其余部分,递归过程就是,先将表头结点从链表拆出来,然后对其余部分进行逆序,最后将当前表头结点链接到逆序链表尾部。...0; } 3 结语 针对如何实现链表逆置,提出利用头插法和递归法进行处理,通过利用IDLE编写,证明该方法是有效,通过本次实验加深链表基本处理操作,为更深入有关链表操作积累了经验,有助于提升对链表操作能力

23010

算法-链表创建

先创建一个头结点,不需要有数据域,头结点next指向null 2.循环中创建结点,把头结点next赋值给 新结点next,相当于新结点next指向了(头结点next所指向) 3.把新结点赋值给头结点...next ,相当于头结点next指向了新结点,这样就串起来了 4.头结点就相当于整个链表 5.循环遍历时候,头结点没有数据可以直接跳过,把结点next赋值给结点,相当于向下移动了一项 c语言版:...char* data; struct Node* next; } Node; typedef Node* LinkList; int main(){ //1.创建一个链表...(Node)); a1->data="aaa"; a1->next=NULL; head->next=a1; //a1是指向第一个结点指针...,赋值给a1->next,就相当于a1->next指向了a2 //2.循环创建一个链表 LinkList list=(LinkList)malloc(sizeof(Node

55210

重温数据结构系列随笔:链表c#模拟实现)

上一节我们讲述了数据结构基本概念,这一节让我们来讨论下单链表概念和实现 我从书中简单摘录下单链表概念 简单而言链表是通过许多节点构成,每个节点包含2个重要元素:该节点数据(数据域)和指向下个节点地址...,数据域是姓名,指针域就是那个箭头所表示指向它后继,头节点h->zhao->Qian->....Wang 这样连接起来就是一个完整链表,头结点数据域可以是任何信息,尾节点地址域是空(他没有后继节点了...然后将节点地址域一一连接起来 肯定会有朋友问我,那么你怎么在链表插入数据或删除数据呢?...,请大家仔细消化下 最后是删除一个节点情况: 和添加节点正好逆向思维,当我们删除b节点时,我们要将a节点指针域指向c节点保证我们链表不被破坏 删除方法同样写在LinkTable类 /// <summary...,其实在效率性能上这样链表不及数组,因为数组更本没有那么繁琐, 大家在实际项目还是用数组比较好,下章会和大家先补充下c#LinkList类和Array类区别(*数组和链表区别(很重要)),

95950

常用链表排序算法_链表排序算法

tail->next 图10:有N个节点链表选择排序 1、先在原链表找最小,找到一个后就把它放到另一个空链表; 2、空链表安放第一个进来节点,产生一个有序链表,并且让它在原链表中分离出来...(此时要注意原链表中出来是第一个节点还是中间其它节点); 3、继续在原链表找下一个最小,找到后把它放入有序链表尾指针next,然后它变成其尾指针; */ struct student *...=NULL; p=p->next) /*循环遍历链表节点,找出此时最小节点。...2、从图12链表取节点,到图11链表定位插入。 3、上面图示虽说画了两条链表,其实只有一条链表。在排序,实质只增加了一个用于指向剩下需要排序节点头指针first罢了。...*/ first = first->next; /*无序链表节点离开,以便它插入到有序链表

57520

【海贼王数据航海】链表链表

1 -> 链表 1.1 -> 链表概念及结构 概念:链表是一种物理存储结构上非连续、非顺序存储结构,数据元素逻辑顺序是通过链表指针链接次序实现。...现实 数据结构 注意: 上图可看出,链式结构在逻辑上是连续,但是在物理上不一定连续; 现实结点一般都是从堆上申请出来; 从堆上申请空间,是按照一定策略分配,两次申请空间可能连续,也可能不连续...假设在32位系统上,结点中值域为int类型,则一个节点大小为8个字节,则也可能有以下链表: 1.2 -> 链表分类 实际链表结构非常多样,以下情况组合起来就有八种链表结构: 1....实际更多是作为其他数据结构子结构,如哈希桶、图邻接表等。 2. 带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用链表数据结构,都是带头双向循环链表。...void SLTPrint(SLTNode* phead); // 链表尾插 void SLTPushBack(SLTNode** pphead, SLTDateType x); // 链表头插

5710

Java基础–链表实现

Java内部也有自己链表–LinkedList,但是我们今天不是讨论LinkedList,而是自己来实现一个链表,包括简单增删查改: 链表结构 链表基本操作 虚拟头结点使用 整个类设计如下...//构造函数 public Linked(){ this.head = null; this.size = 0; } } 链表结构 一种链式存取数据结构,链表数据是以结点形式存在...链表与数组相比最大差别是:链表数据元素存放在内存空间地址是不连续,而数组数据元素存放地址在内存空间中是连续,这也是为什么根据索引无法像数组那样直接就能查询到数据元素。...,以及判别某结点是否存在链表 链表结点增加 进行结点添加时候,是根据索引来进行操作,由于成员变量size记录了当前链表元素个数,进行某个索引位置结点插入就会很方便了。...如果先进行pre.next指向要插入结点,再进行node.next指向pre.next的话,无疑是要插入结点自己指向了自己,无法连接上整个链表,在链表操作,有时候顺序执行会带来不一样结果。

38110
领券