首页 > 编程语言 >C# 链表排序之插入排序

C# 链表排序之插入排序

时间:2024-09-17 09:51:23浏览次数:10  
标签:currentNode C# 插入排序 list Next 链表 排序 prevNode

在C#中,对于链表(如LinkedList<T>)进行排序,插入排序是一个可行的选择,尽管它可能不是最高效的排序方法,特别是当链表很长时。插入排序的基本思想是将链表分成已排序和未排序的两部分,初始时,已排序部分只包含链表的第一个元素,然后依次将未排序部分的元素插入到已排序部分的适当位置。

由于链表不支持像数组那样的直接索引访问,因此在链表中实现插入排序时,我们需要通过遍历来找到插入位置,并调整链表的指针。

下面是一个C#中使用LinkedList<T>进行插入排序的示例代码:

using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        LinkedList<int> linkedList = new LinkedList<int>();

        // 示例:向链表添加一些未排序的元素
        linkedList.AddLast(4);
        linkedList.AddLast(1);
        linkedList.AddLast(3);
        linkedList.AddLast(5);
        linkedList.AddLast(2);

        Console.WriteLine("原始链表:");
        PrintLinkedList(linkedList);

        // 对链表进行插入排序
        InsertionSort(linkedList);

        Console.WriteLine("排序后的链表:");
        PrintLinkedList(linkedList);
    }

    // 插入排序函数
    static void InsertionSort(LinkedList<int> list)
    {
        if (list.Count <= 1) return; // 如果链表为空或只有一个元素,则无需排序

        LinkedListNode<int> currentNode = list.First.Next; // 从第二个节点开始遍历
        LinkedListNode<int> prevNode = null;

        while (currentNode != null)
        {
            // 如果当前节点小于头节点,则将当前节点移动到链表头部
            if (currentNode.Value < list.First.Value)
            {
                list.AddFirst(currentNode.Value);
                list.Remove(currentNode); // 移除旧节点
                currentNode = list.First.Next; // 重置currentNode,因为链表结构已变
                if (prevNode != null)
                {
                    prevNode = prevNode.Next; // 如果prevNode非空,则向前移动
                }
            }
            else
            {
                // 否则,找到当前节点应插入的位置
                prevNode = list.First;
                while (prevNode.Next != null && prevNode.Next.Value < currentNode.Value)
                {
                    prevNode = prevNode.Next;
                }

                // 将当前节点插入到正确位置
                if (prevNode.Next != currentNode)
                {
                    list.AddAfter(prevNode, currentNode.Value);
                    list.Remove(currentNode);
                    currentNode = prevNode.Next; // currentNode现在是新插入的节点
                }
            }

            // 如果没有提前终止循环(即currentNode为null),则继续向后遍历
            if (currentNode.Next != null)
            {
                currentNode = currentNode.Next;
            }
            else
            {
                // 如果已经到达链表末尾,则停止遍历
                currentNode = null;
            }
        }
    }

    // 打印链表
    static void PrintLinkedList(LinkedList<int> list)
    {
        foreach (var item in list)
        {
            Console.Write(item + " ");
        }
        Console.WriteLine();
    }
}

注意:上面的代码示例在功能上可能不是最优的,特别是在处理节点删除和重新插入时。在实际应用中,你可能需要考虑更高效的数据结构或算法来处理大量数据的排序问题。

此外,上述代码中的InsertionSort方法在处理完小于头节点的节点后,没有重新检查currentNode是否已经通过AddFirstRemove操作被移动到了新的位置,这可能导致无限循环或跳过某些节点的处理。因此,在移除节点后,应适当更新currentNode的引用。不过,为了避免复杂性,我使用了更简单的逻辑,这可能在某些情况下不是最优的。

对于大型数据集,考虑使用更高效的排序算法(如快速排序、归并排序)或数据结构(如平衡二叉搜索树)可能更为合适。

标签:currentNode,C#,插入排序,list,Next,链表,排序,prevNode
From: https://blog.csdn.net/x1234w4321/article/details/141720010

相关文章

  • .NET源码的在线探索:source.dot.net网站深度解析
    一个在线的.NET源码查询网站为https://source.dot.net/。这个网站为开发者提供了便捷的.NET源码查询服务,无需从GitHub等代码托管平台下载整个源代码库,即可在线浏览和查询.NET框架及相关项目的源代码。以下是该网站的一些主要功能特性:在线查询:用户可以直接在网站上搜索特......
  • 简单论述TCP,UDP,HTTP,SMTP,DNS,RTP之间的关系(计算机网络408)
            最近有很多同学在刚接触计算机网络概论的时候很容易被提及到IP,TCP,UDP....之类的东西,这里就简单论述一下他们是干什么的。                                                             ......
  • 10个商业提示词的 ChatGPT问题
    10个商业提示词的ChatGPT问题以下是10个问题的提示词与示例1.精益创业方法论问题:"ChatGPT,我如何运用精益创业方法论快速测试和验证我的[业务创意/产品]?"2.OKR(目标和关键结果)问题:"ChatGPT,指导我为[你的业务/项目]建立OKR,以协调团队目标和推动绩效。"3.PEST分析问题:"ChatGP......
  • 除了不要SELECT *,SQL还有哪些优化技巧?
    应用程序慢如牛,原因多多,可能是网络的原因、可能是系统架构的原因,还有可能是数据库的原因。那么如何提高数据库SQL语句执行速度呢?有人会说性能调优是数据库管理员(DBA)的事,然而性能调优跟程序员们也有莫大的关系。程序中嵌入的一行行的SQL语句,如果使用了一些优化小技巧,定能达到事半......
  • Docker 进阶篇-CIG 重量级监控系统
    上一篇讲的是轻量级的监控工具,本文就来讲重量级的:CAdvisor+InfluxDB+Granfana,简称CIG。​‍‍dockerstats原生的Docker命令中,stats可以查看每个容器占用的CPU,内存,网络流量等情况:CONTAINERIDNAMECPU%MEMUSAGE/LIMITMEM%NETI/O......
  • Microsoft 365 Copilot: Wave 2
      每周跟踪AI热点新闻动向和震撼发展想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领域的领跑者。点击订阅,与未来同行!订阅:https://......
  • 太戈编程26-30题AC答案(第六期)
    26扫雷游戏普及-#include<bits/stdc++.h>usingnamespacestd;intmain(){   intm,n;   cin>>m>>n;   charx[m+2][n+2];   for(inti=1;i<=m;i++){      for(intj=1;j<=n;j++)        cin>>x[i][j];   }   for(i......
  • macOS Sequoia 15 发布,iPhone 镜像、密码应用程序、窗口平铺更新等带来全新体验
    macOSSequoia15发布,iPhone镜像、密码应用程序、窗口平铺更新等带来全新体验2024年9月17日凌晨1点请访问原文链接:https://sysin.org/blog/macOS-Sequoia/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgTimCook领导的Apple今天发布了macOS15Sequoia......
  • C:\Users\用户名\AppData\Roaming\ 是 Windows 操作系统中的一个特殊文件夹,用于
    C:\Users\用户名\AppData\Roaming\是Windows操作系统中的一个特殊文件夹,用于存储应用程序的数据和设置。这个文件夹通常用于存放用户级别的应用程序配置文件、数据文件和其他需要在用户登录时保留的信息。这里的路径分为几个部分:C:\Users\用户名\:这是当前用户的主文件夹路......
  • error: rpmdb, failed: BDB1507 Thread died in Berkeley DB library,error(-30973) fro
    rpm数据库错误,一般原因:yum更新等rpm软件安装进程被异常终止[root@49bdfccd7f61~]#yuminstall-yxxxerror:rpmdb:BDB0113Thread/process22858/140222685267712failed:BDB1507ThreaddiedinBerkeleyDBlibraryerror:db5error(-30973)fromdbenv->failchk:BDB0......