[英]C# Radix Sort implementation in LinkedList
我的任务是为链表 class 制作基数排序算法,我有一个 object“信息”,它有 int Year 和 double Price,我需要使用基数排序按年份对链表进行排序。
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;
}
}
我已经从这个站点为 integer 采用了基数排序算法。 问题是,我不知道如何修改它以使用我链接的 class。
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);
}
}
如何使它与我链接的 class 一起工作?
根据该代码, arr 和 tmp 需要是链表。 这种方法的一个问题是移动节点需要跟踪先前的节点才能移动节点。 虚拟头节点可用于提供第一个数据节点之前的节点,或将节点移动到列表开头时的特殊情况处理。 另一种方法是使用两个指向临时列表节点的指针(引用),一个在位 == 0 的位置,一个在位 == 1 的位置,然后将两个临时列表连接成一个列表。 请注意,此方法需要 32 次通过。 如果基数排序是基于一个字节而不是一个位,它可以减少到 4 遍,但是对于 256 个列表需要 256 个指向节点的指针。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.