LinkedList 中的 C# 基数排序实现

Posted

技术标签:

【中文标题】LinkedList 中的 C# 基数排序实现【英文标题】:C# Radix Sort implementation in LinkedList 【发布时间】:2020-04-27 14:41:54 【问题描述】:

我的任务是为链表类创建基数排序算法,我有一个对象“Info”,它有 int Year 和 double Price,我需要使用基数排序按 Year 对链表进行排序。

    class Info
    
        public int Year  get; set; 
        public double Price  get; set; 
        public Info()  
        public Info(int y, double p)
        
            Year = y;
            Price = p;
        
    
    class Node
    
        public Info Data  get; set; 
        public Node Next  get; set; 
        public Node(Info data, Node adress)
        
            Data = data;
            Next = adress;
        
    
    class LinkedList
    
        private Node First;
        private Node Last;
        private Node Current;
        public LinkedList()
        
            First = null;
            Last = null;
            Current = null;
        
     

我已经从这个site 中采用了整数的基数排序算法。问题是,我不知道如何修改它以使用我的链接类。

        static void Sort(int[] arr)
        
            int temp = 0;
            int i, j;
            int[] tmp = new int[arr.Length];
            for (int shift = 31; shift > -1; --shift)
            
                j = 0;
                for (i = 0; i < arr.Length; ++i)
                
                    bool move = (arr[i] << shift) >= 0;
                    if (shift == 0 ? !move : move)
                        arr[i - j] = arr[i];
                    else
                        tmp[j++] = arr[i];
                
                Array.Copy(tmp, 0, arr, arr.Length - j, j);
            
        

如何使它与我的链接类一起工作?

【问题讨论】:

【参考方案1】:

根据该代码, arr 和 tmp 需要是链表。这种方法的一个问题是移动节点需要跟踪先前的节点才能移动节点。虚拟头节点可用于提供第一个数据节点之前的节点,或将节点移动到列表开头时的特殊情况处理。另一种方法是使用两个指向临时列表节点的指针(引用),一个在位 == 0 的位置,一个在位 == 1 的位置,然后将两个临时列表连接成一个列表。请注意,此方法需要 32 次通过。如果基数排序是基于一个字节而不是一个位,它可以减少到 4 遍,但需要 256 个指向节点的指针以用于 256 个列表。

【讨论】:

以上是关于LinkedList 中的 C# 基数排序实现的主要内容,如果未能解决你的问题,请参考以下文章

C# 各种内部排序方法的实现(直接插入排序希尔排序冒泡排序快速排序直接选择排序堆排序归并排序基数排序)

为啥我的基数排序 python 实现比快速排序慢?

你如何计算基数排序的数字

Python中的基数排序[关闭]

什么是基数排序?

我被困在递归地实现基数排序