对链接列表进行排序

2024-04-15

我用 C# 编写了一个基本的链表类。它有一个 Node 对象,它(显然)代表列表中的每个节点。

代码中没有使用IEnumerable,但是我可以实现排序功能吗?我使用的语言是C#。 C#中有这样的例子吗?

我正在从这个工作sample http://www.c-sharpcorner.com/UploadFile/jeradus/UsingLinkedListInCS11102005005525AM/UsingLinkedListInCS.aspx:

Thanks


函数式快速排序和归并排序

这是一个以函数式风格编写的包含快速排序和合并排序方法的链表:

class List
{
    public int item;
    public List rest;

    public List(int item, List rest)
    {
        this.item = item;
        this.rest = rest;
    }

    // helper methods for quicksort

    public static List Append(List xs, List ys)
    {
        if (xs == null) return ys;
        else return new List(xs.item, Append(xs.rest, ys));
    }

    public static List Filter(Func<int,bool> p, List xs)
    {
        if (xs == null) return null;
        else if (p(xs.item)) return new List(xs.item, Filter(p, xs.rest));
        else return Filter(p, xs.rest);
    }

    public static List QSort(List xs)
    {
        if (xs == null) return null;
        else
        {
            int pivot = xs.item;
            List less = QSort(Filter(x => x <= pivot, xs.rest));
            List more = QSort(Filter(x => x > pivot, xs.rest));
            return Append(less, new List(pivot, more));
        }
    }

    // Helper methods for mergesort

    public static int Length(List xs)
    {
        if (xs == null) return 0;
        else return 1 + Length(xs.rest);
    }

    public static List Take(int n, List xs)
    {
        if (n == 0) return null;
        else return new List(xs.item, Take(n - 1, xs.rest));
    }

    public static List Drop(int n, List xs)
    {
        if (n == 0) return xs;
        else return Drop(n - 1, xs.rest);
    }

    public static List Merge(List xs, List ys)
    {
        if (xs == null) return ys;
        else if (ys == null) return xs;
        else if (xs.item <= ys.item) return new List(xs.item, Merge(xs.rest, ys));
        else return new List(ys.item, Merge(xs, ys.rest));
    }

    public static List MSort(List xs)
    {
        if (Length(xs) <= 1) return xs;
        else
        {
            int len = Length(xs) / 2;
            List left  = MSort(Take(len, xs));
            List right = MSort(Drop(len, xs));
            return Merge(left, right);
        }
    }

    public static string Show(List xs)
    {
        if(xs == null) return "";
        else return xs.item.ToString() + " " + Show(xs.rest);
    }
}

使用配对堆的函数式堆排序

奖励:堆排序(使用功能配对堆)。

class List
{
    // ...

    public static Heap List2Heap(List xs)
    {
        if (xs == null) return null;
        else return Heap.Merge(new Heap(null, xs.item, null), List2Heap(xs.rest));
    }

    public static List HSort(List xs)
    {
        return Heap.Heap2List(List2Heap(xs));
    }
}

class Heap
{
    Heap left;
    int min;
    Heap right;

    public Heap(Heap left, int min, Heap right)
    {
        this.left = left;
        this.min = min;
        this.right = right;
    }

    public static Heap Merge(Heap a, Heap b)
    {
        if (a == null) return b;
        if (b == null) return a;

        Heap smaller = a.min <= b.min ? a : b;
        Heap larger = a.min <= b.min ? b : a;
        return new Heap(smaller.left, smaller.min, Merge(smaller.right, larger));
    }

    public static Heap DeleteMin(Heap a)
    {
        return Merge(a.left, a.right);
    }

    public static List Heap2List(Heap a)
    {
        if (a == null) return null;
        else return new List(a.min, Heap2List(DeleteMin(a)));
    }
}

对于实际使用,您希望重写辅助方法而不使用递归,并且可能使用像内置列表一样的可变列表。

如何使用:

List xs = new List(4, new List(2, new List(3, new List(1, null))));
Console.WriteLine(List.Show(List.QSort(xs)));
Console.WriteLine(List.Show(List.MSort(xs)));
Console.WriteLine(List.Show(List.HSort(xs)));

链表的命令式就地快速排序

请求就地版本。这是一个非常快速的实现。我从上到下编写了这段代码,没有寻找机会使代码变得更好,即每一行都是我想到的第一行。它非常丑陋,因为我使用 null 作为空列表:) 缩进不一致等。

此外,我仅在一个示例上测试了此代码:

        MList ys = new MList(4, new MList(2, new MList(3, new MList(1, null))));
        MList.QSortInPlace(ref ys);
        Console.WriteLine(MList.Show(ys));

神奇的是,第一次就成功了!我很确定这段代码包含错误。别让我负责。

class MList
{
    public int item;
    public MList rest;

    public MList(int item, MList rest)
    {
        this.item = item;
        this.rest = rest;
    }

    public static void QSortInPlace(ref MList xs)
    {
        if (xs == null) return;

        int pivot = xs.item;
        MList pivotNode = xs;
        xs = xs.rest;
        pivotNode.rest = null;
        // partition the list into two parts
        MList smaller = null; // items smaller than pivot
        MList larger = null; // items larger than pivot
        while (xs != null)
        {
            var rest = xs.rest;
            if (xs.item < pivot) {
                xs.rest = smaller;
                smaller = xs;
            } else {
                xs.rest = larger;
                larger = xs;
            }
            xs = rest;
        }

        // sort the smaller and larger lists
        QSortInPlace(ref smaller);
        QSortInPlace(ref larger);

        // append smaller + [pivot] + larger
        AppendInPlace(ref pivotNode, larger);
        AppendInPlace(ref smaller, pivotNode);
        xs = smaller;
    }

    public static void AppendInPlace(ref MList xs, MList ys)
    {
        if(xs == null){
            xs = ys;
            return;
        }

        // find the last node in xs
        MList last = xs;
        while (last.rest != null)
        {
            last = last.rest;
        }
        last.rest = ys;
    }

    public static string Show(MList xs)
    {
        if (xs == null) return "";
        else return xs.item.ToString() + " " + Show(xs.rest);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对链接列表进行排序 的相关文章

  • 从 Invoke 方法获取 RETURN

    我正在尝试从另一个线程上的列表框项目中读取值 我尝试创建一种新方法来运行调用命令 我可以设法将命令发送到列表框 例如通过调用方法添加 但我似乎无法得到响应 我似乎无法获取该项目的值 我尝试了几种方法 一旦我将它从空变为字符串 事情就开始变得
  • Nullable 是不可能的,为什么不呢? [复制]

    这个问题在这里已经有答案了 如果这是一个愚蠢的问题 请原谅 我正在尝试更好地理解 Net 中的 Nullable 类型 从我从 Microsoft 源代码 使用 ReSharper 中注意到的内容 我了解到 Nullable 是一个结构 而
  • 通过 SOAP 的 Gmt php 或 UTC C# 等效项

    is C DateTime UtcNow和 PHPdate c 是等价的 我怀疑 因为当我肥皂时 我得到了 C
  • 如何调整 Windows 窗体以适应任何屏幕分辨率?

    我知道这是重复的问题 但我检查了所有其他相关问题 他们的答案没有帮助 结果仍然与屏幕截图 2 中所示相同 我是 C Windows 窗体新手 如截图1所示 我有Form1有一些控件 每组控件都放在一个面板中 我在 PC1 中设计了应用程序
  • MSMQ接收和删除

    是否有任何选项可以在读取消息后将其从 MSMQ 中删除 比如 接收 删除可以作为原子操作运行吗 听起来您想查看下一条消息 然后在处理完成后接收它 Message message Queue Peek Queue ReceiveById me
  • 以下 PLINQ 代码没有改进

    我没有看到使用以下代码的处理速度有任何改进 IEnumerable
  • 从时间列表中查找最接近的时间

    所以 这是场景 我有一个带有创建时间的文件 我想从该文件的创建时间最接近或相等的时间列表中选择一个时间 完成此操作的最佳方法是什么 var closestTime listOfTimes OrderBy t gt Math Abs t fi
  • make_shared<>() 中的 WKWYL 优化是否会给某些多线程应用程序带来惩罚?

    前几天我偶然看到这个非常有趣的演示 http channel9 msdn com Events GoingNative GoingNative 2012 STL11 Magic Secrets作者 Stephan T Lavavej 其中提
  • C 类型命名约定,_t 或 ALLCAPS

    我一直想知道是否有任何命名约定 例如何时对类型使用全部大写以及何时追加 t 什么时候不使用任何东西 我知道当时 K R 发布了各种有关如何使用 C 的文档 但我找不到任何相关内容 在 C 标准库类型中 t看起来漂亮占主导地位 time t
  • 为什么 std::function 不是有效的模板参数,而函数指针却是?

    我已经定义了名为的类模板CallBackAtInit其唯一目的是在初始化时调用函数 构造函数 该函数在模板参数中指定 问题是模板不接受std function作为参数 但它们接受函数指针 为什么 这是我的代码 include
  • 如何增加ofstream的缓冲区大小

    我想增加 C 程序的缓冲区大小 以便它不会过于频繁地写入 默认缓冲区是 8192 字节 我尝试使用 pubsetbuf 将其增加到 200K 原始代码 ofstream fq fastq1 cstr ios out fastq1 is a
  • 如何在新窗口中打开图像或pdf文件?

    我有一个 gridview 它包含文件名和文件路径 图像和 pdf 格式文件 其中我使用了模板字段 在该字段下放置了 1 个图像按钮 单击该图像按钮 即 查看 按钮 时 我想在新窗口中打开所选文件 这是我的代码 protected void
  • 从点云检测平面集

    我有一组点云 我想测试3D房间中是否有角落 所以我想讨论一下我的方法 以及在速度方面是否有更好的方法 因为我想在手机上测试它 我将尝试使用霍夫变换来检测线 然后我将尝试查看是否有三条线相交 并且它们也形成了两个相交的平面 如果点云数据来自深
  • 是否可以在Linux上将C转换为asm而不链接libc?

    测试平台为Linux 32位 但也欢迎 Windows 32 位上的某些解决方案 这是一个c代码片段 int a 0 printf d n a 如果我使用 gcc 生成汇编代码 gcc S test c 然后我会得到 movl 0 28 e
  • 如果在代码中添加元素,“FindName”将不起作用

    在 WPF 应用程序中 如果在 XAML 中声明 ContentControl
  • WinForms - 加载表单时如何使用 PaintEventArgs 运行函数?

    我试图理解图形 在 Graphics FromImage 文档中 它有这样的示例 private void FromImageImage PaintEventArgs e Create image Image imageFile Image
  • 将日期时间显示为 MM/dd/yyyy HH:mm 格式 C#

    在数据库中 日期时间以 MM dd yyyy HH mm ss 格式存储 但是 我想以 MM dd yyyy HH mm 格式显示日期时间 我通过使用 String Format 进行了尝试 txtCampaignStartDate Tex
  • 使用 IdentityDbContext 和 Code First 自动迁移表位置和架构的实体框架?

    我正在尝试使用 IdentityDbContext 类设置自动迁移更新 并将更改传播到整个数据库的实际 DbContext 在进入代码之前 在使用自动迁移实现 IdentityDbContext 时 我收到此错误 影响迁移历史系统表位置的自
  • Unity,c++ 本机插件字节数组不匹配

    在我的 C 本机插件中 我有一个调用 vector
  • 如何知道 HTTP 请求标头值是否存在

    我确信这很简单 但是却让我感到厌烦 我在 Web 应用程序中使用了一个组件 它在 Web 请求期间通过添加标头 XYZComponent true 来标识自身 我遇到的问题是 如何在视图中检查此组件 以下内容不起作用 if Request

随机推荐

  • 设置 npm 注册表 URL 的用户名和密码

    我正在尝试使用 npm 从 url 安装软件包 http 主机 80 http host 80 我做了以下事情 npm 配置设置 strict ssl false npm 配置设置注册表 npm 代理http 主机 端口 http host
  • JavaScript - 控制 document.write 的插入点

    我想创建一个运行第三方脚本的页面 其中包括document write当 DOM 已经完全加载之后 我的页面不是 XHTML 我的问题是 document write 正在覆盖我自己的页面 这就是 DOM 加载后它所做的事情 我尝试重写 d
  • 使用谷歌地图 API iOS 进行反向地理编码

    我正在使用以下代码进行反向地理编码 void locationManager CLLocationManager manager didUpdateToLocation CLLocation newLocation fromLocation
  • Facebook API 人物搜索按国家/地区过滤

    我正在尝试使用 Facebook API Graph API 或 FQL 以有效者为准 搜索人员 到目前为止 它工作得很好 但我无法按国家或语言对其进行过滤 我目前正在检索此网址 https graph facebook com searc
  • 无法分配给变量,因为它是借用的

    我试图在循环中重新分配变量 但我不断遇到cannot assign to cur node because it is borrowed 下面为了简单起见我注释掉了循环 这是同样的问题 我该如何处理这个问题 fn naive largest
  • Java 未知格式转换异常

    下面的代码引发了这个错误 我不知道为什么 将 String format 输出到str变量 但我不知道它出了什么问题 Exception in thread main java util UnknownFormatConversionExc
  • Android 中的屏幕截图

    我想开发一个应用程序来截取 android 屏幕的屏幕截图 有人知道怎么做吗 这类似于 koushik duttas 屏幕截图 但是没有使用 root 并且有人有 koushik dutta 屏幕截图应用程序正在运行 不适合我 请让我知道
  • Kubernetes Dashboard 在整个网站上都是“被禁止的”

    我在 Kubernetes 的仪表板网站上到处都看到 被禁止 见图 重现 通过站点而不是从 shell 创建 Google Kubernetes 集群 选择 Kubernetes 版本 1 8 6 通过连接按钮打开外壳 gcloud con
  • Autobahn websockets Android 演示崩溃

    我是 websockets 的新手 我一直在使用 Autobahn websocket 来制作一个更大的项目 它在 python 和 js 版本中工作得很好 但我在 Android API 上遇到了麻烦 我正在遵循中的教程http www
  • 取消任务关闭窗口。如何检测任务是否同步返回?

    我遵循一种相当常见的模式 使用异步对话框方法确认 取消主窗口关闭 但是 在我调用来呈现对话框的异步任务中 在某些情况下我会立即返回布尔值 而不是等待对话框任务方法的返回 在这些情况下会抛出异常 System InvalidOperation
  • WPF/XAML:如何使 TextBlock 中的所有文本大写?

    我希望 TextBlock 中的所有字符都以大写形式显示
  • 无法使用 iframe 标签在 WebView 中播放视频?

    我正在使用以下数据来显示WebView 这些是 HTML 标签以及 指的是视频的 iframe 现在的问题是 当我点击它时 它显示播放按钮 但无法播放视频 我可以在里面播放这个视频吗WebView or not lt p gt lt p g
  • 反汇编中演示 volatile 的示例 C 代码?

    演示反汇编中易失性和非易失性之间差异的简短说明性 C 程序是什么 ie int main volatile int x vs int main int x 我们可以用什么来代替两者 这样生成的代码就不同了 例如 x 0 If x is no
  • 从原始 r 和 s 创建 DER 格式的 ECDSA 签名

    我有一个原始 ECDSA 签名 R 和 S 值 我需要 DER 编码版本的签名 有没有一种直接的方法可以使用 c 接口在 openssl 中执行此操作 我目前的尝试是使用i2d ECDSA SIG const ECDSA SIG sig u
  • 单选按钮选中更改事件触发两次

    请阅读我的问题 它不是重复的问题 我在 Windows 窗体上有三个单选按钮 所有这些按钮都具有关联的常见 CheckedChanged 事件 当我单击任何这些单选按钮时 它会触发 CheckedChanged 事件两次 这是我的代码 pr
  • 什么可能导致 ASP.NET 应用程序忘记用户?

    我有一个 ASP NET 应用程序 它似乎在一段时间后忘记了用户已登录 我正在使用会员资格提供商 当选择 记住 登录时 它会在会话期间记住它 我什至可以关闭浏览器 重新启动并返回 它仍然会登录 但过了一段时间它就会忘记 而且似乎在任何旧时间
  • 在 ASP.NET 3.5 中创建 RSS 源

    如何使用 C 在 ASP NET 3 5 中创建 RSS 提要 哪些框架部分可以帮助 NET 开发人员更轻松地发布 RSS 或 Atom 提要 NET 4 中是否有任何额外功能可以使此任务比 3 5 中更容易 3 5 中有一个新的命名空间
  • 如何限制拖动元素在interact.js中重叠

    容器中的拖动元素不应该重叠 我们如何限制 请帮忙 交互API链接 http interactjs io 抱歉 没有尽早回答这个问题 我相信你必须手动检查元素的顶部 底部 左侧和右侧边缘的位置 所以这就是我所做的 Call this func
  • matlab 数组中的 DICOM 维度(所有帧都以数组的最后一个维度结束)

    在我的 GUI 之一中 我加载 DICOM 图像 有时它们只是一个体积和另一个维度 当我将它们加载到 Matlab 中时 一切都会到达我想要的位置 handles inf dicominfo filepath filename handle
  • 对链接列表进行排序

    我用 C 编写了一个基本的链表类 它有一个 Node 对象 它 显然 代表列表中的每个节点 代码中没有使用IEnumerable 但是我可以实现排序功能吗 我使用的语言是C C 中有这样的例子吗 我正在从这个工作sample http ww