C#单向链表实现:对链表初始数据进行冒泡排序的方法

目录

一、涉及到的知识点

1.冒泡排序

2.什么时候需要对链表数据排序

二、对链表初始数据冒泡排序算法实现

1.首先,检查输入的链表头节点head是否为空或者只有一个节点

2.接下来,进入一个do-while循环

3.在每次循环中,首先将当前节点current初始化为链表头节点

4.在内部while循环中

[5. 在内部while循环结束后](#5. 在内部while循环结束后)

6.当外部do-while循环结束时

三、完整的实例


一、涉及到的知识点

1.冒泡排序

冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地遍历待排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

以下是冒泡排序算法的实现过程:

  1. 比较相邻的元素。如果第一个比第二个大(升序),就交换它们两个。
  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

在实现冒泡排序算法的过程中,通常使用嵌套循环来完成。外层循环负责控制遍历的次数,内层循环负责比较相邻元素并进行交换。在每一轮遍历过程中,最大的元素会逐渐"冒泡"到数列的最后。当所有元素都排序完毕后,算法结束。

2.什么时候需要对链表数据排序

  • 主观上需要对链表的数据进行排序的时候;
  • 必须先对链表数据执行排序操作,才能有效地执行其它方法,比如升序插入操作之前就需要对已有的链表数据进行排序操作。

二、对链表初始数据冒泡排序算法实现

使用了C#实现了一个冒泡排序算法,用于对链表中的节点进行排序。下面结合源码详细介绍一下冒泡排序算法的实现过程:

1.首先,检查输入的链表头节点head是否为空或者只有一个节点

如果是,那么这个链表已经排序完毕,直接返回head。

cs 复制代码
if (head == null || head.Next == null)
{
    return head;
}

2.接下来,进入一个do-while循环

这个循环会一直执行到没有节点需要交换为止。变量swapped用于标记在当前循环中是否发生了节点值的交换。

cs 复制代码
bool swapped;
do
{
    swapped = false;

3.在每次循环中,首先将当前节点current初始化为链表头节点

然后在current不为null且current的下一个节点也不为null的情况下,进入一个while循环。

cs 复制代码
ListNode? current = head;
while (current != null && current.Next != null)

4.在内部while循环中

如果当前节点current的值大于下一个节点的值,那么就交换这两个节点的值,并将变量swapped设置为true,表示发生了交换。

cs 复制代码
if (current.Next.Value < current.Value)
{
    int temp = current.Value;
    current.Value = current.Next.Value;
    current.Next.Value = temp;
    swapped = true;
}

5. 在内部while循环结束后

将current向后移动一位,以便在下一次循环中比较下一个节点。

cs 复制代码
current = current.Next;

6.当外部do-while循环结束时

说明链表中的节点已经按照升序排序完毕,返回排序后的链表头节点head。

cs 复制代码
} while (swapped);

return head;

这段程序通过双重循环实现了冒泡排序算法,外部do-while循环负责控制排序的次数,内部while循环负责比较相邻节点并进行交换。在每一轮遍历过程中,最大的节点会逐渐"冒泡"到链表的最后。当所有节点都排序完毕后,算法结束。

三、完整的实例

cs 复制代码
// 对链表初始数据进行冒泡排序并输出
namespace _131_6
{
    public class ListNode(int value)
    {
        public int Value { get; set; } = value;
        public ListNode? Next { get; set; }
    }

    class Program
    {
        public static void PrintList(ListNode? head)
        {
            ListNode? current = head;
            while (current != null)
            {
                Console.Write(current.Value + " ");
                current = current.Next;
            }
            Console.WriteLine();
        }

        /// <summary>
        /// 对链表数据冒泡排序
        /// </summary>
        public static ListNode? SortList(ListNode? head)
        {
            if (head == null || head.Next == null)
            {
                return head;
            }

            bool swapped;
            do
            {
                swapped = false;
                ListNode? current = head;
                while (current != null && current.Next != null)
                {
                    if (current.Next.Value < current.Value)
                    {
                        (current.Next.Value, current.Value) = (current.Value, current.Next.Value);
                        swapped = true;
                    }
                    current = current.Next;
                }
            } while (swapped);

            return head;
        }

        static void Main(string[] args)
        {
            ArgumentNullException.ThrowIfNull(args);

            ListNode? head = new(5)
            {
                Next = new ListNode(2)
            };
            head.Next.Next = new ListNode(8)
            {
                Next = new ListNode(1)
            };
            PrintList(head);
            Console.WriteLine("********");

            // 对初始链表进行排序
            head = SortList(head);
            PrintList(head);
        }
    }
}
//运行结果:
/*
5 2 8 1
********
1 2 5 8

 */
相关推荐
ღ᭄ꦿ࿐Never say never꧂几秒前
微服务架构中的负载均衡与服务注册中心(Nacos)
java·spring boot·后端·spring cloud·微服务·架构·负载均衡
所待.3832 分钟前
小小扑克牌算法
java·算法
.生产的驴10 分钟前
SpringBoot 消息队列RabbitMQ 消息确认机制确保消息发送成功和失败 生产者确认
java·javascript·spring boot·后端·rabbitmq·负载均衡·java-rabbitmq
.生产的驴10 分钟前
SpringBoot 消息队列RabbitMQ在代码中声明 交换机 与 队列使用注解创建
java·spring boot·分布式·servlet·kafka·rabbitmq·java-rabbitmq
idealzouhu24 分钟前
Java 并发编程 —— AQS 抽象队列同步器
java·开发语言
听封28 分钟前
Thymeleaf 的创建
java·spring boot·spring·maven
眰恦37431 分钟前
数据结构--第六章图
数据结构·算法
写bug写bug34 分钟前
6 种服务限流的实现方式
java·后端·微服务
楠枬1 小时前
双指针算法
java·算法·leetcode