【问题标题】:Radix Sort in File C#文件 C# 中的基数排序
【发布时间】:2020-07-17 06:48:40
【问题描述】:

这是大学的作业。我必须以两种方式对汽车牌照(ABC 123)进行基数排序1)数组2)链表。最有趣的是必须在文件中进行排序。例如,从现在开始我们将只讨论数组。我生成汽车号码并将它们放入数组中,然后通过二进制写入将所有生成的汽车注册牌写入文件。之后,我将新生成的文件提供给 Radix Sort,他需要施展魔法。我将向您展示我目前拥有的代码,但它实际上并不是一个“真正的”基数排序,因为我无法理解如何在文件中实现基数排序。 (我已经为普通数组和链表实现了基数排序,但是当它在文件内完成时,它是令人兴奋的)。我只是想问一下你们中是否有人对我如何改进排序算法有任何提示或想法,因为它太慢了。谢谢。

程序.CS

public static void CountingSort(DataArray items, int exp)
{
    UTF8Encoding encoder = new UTF8Encoding();
    Byte[] forChange = new byte[16];
    double first, second;
    int i, j;
    NumberPlate plate1;
    NumberPlate plate2;
    for (int z = 0; z < items.Length; z++)
    {
        i = 0;
        j = 1;
        while (j < items.Length)
        {
            BitConverter.GetBytes(items[i]).CopyTo(forChange, 0);
            BitConverter.GetBytes(items[j]).CopyTo(forChange, 8);
            string firstPlate = encoder.GetString(forChange, 1, 7);
            string[] partsFirst = firstPlate.Split(' ');
            plate1 = new NumberPlate(partsFirst[0], partsFirst[1]);

            string secondPlate = encoder.GetString(forChange, 9, 7);
            string[] partsSecond = secondPlate.Split(' ');
            plate2 = new NumberPlate(partsSecond[0], partsSecond[1]);

            first = plate1.GetPlateCode() / exp % 10;
            second = plate2.GetPlateCode() / exp % 10;
            if (first > second)
            {
                items.Swap(j, BitConverter.ToDouble(forChange, 0), BitConverter.ToDouble(forChange, 8));
            }
            i++;
            j++;
        }
    }
}

public static void Radix_Sort(DataArray items)
{
    for (int exp = 1; exp < Math.Pow(10, 9); exp *= 10)
    {
        CountingSort(items, exp);
    }
}

public static void Test_File_Array_List(int seed)
{
    int n = 5;
    string filename;
    filename = @"mydataarray.txt";
    //filename = @"mydataarray.dat";
    MyFileArray myfilearray = new MyFileArray(filename, n);
    using (myfilearray.fs = new FileStream(filename, FileMode.Open, FileAccess.ReadWrite))
    {
        Console.WriteLine("\n FILE ARRAY \n");
        myfilearray.Print(n);
        Radix_Sort(myfilearray);
        myfilearray.Print(n);
    }
}

数组.CS

public override double this[int index]
{
    get
    {
        Byte[] data = new Byte[8];
        fs.Seek(8 * index, SeekOrigin.Begin);
        fs.Read(data, 0, 8);
        double result = BitConverter.ToDouble(data, 0);
        return result;
    }
}
public override void Swap(int j, double a, double b)
{
    Byte[] data = new Byte[16];
    BitConverter.GetBytes(b).CopyTo(data, 0);
    BitConverter.GetBytes(a).CopyTo(data, 8);
    fs.Seek(8 * (j - 1), SeekOrigin.Begin);
    fs.Write(data, 0, 16);
}

【问题讨论】:

  • 您确定您的作业最后没有要求生成排序文件吗?就像读取文件,对内存中的元素进行排序(我不知道其中有多少,当然,这是否有效)并将包含已排序项目的文件写回?
  • 另外,该文件只是一个支持查找的流 (FileStream)。如果您存储文件中所有项目的起始位置(每行代表一条记录?),通过保持它们固定大小,您可以通过移动光标(FileStream.Position)并将记录写入到他们的新职位。但这将非常、非常低效。
  • 是的,问题是我必须生成文件,然后对文件中的项目进行排序。如果我需要打印排序列表,那将不是问题。
  • 可以从某个地方下载作业表吗? (虽然如果不是英文的,对这里的大多数人来说不太可能有用。)

标签: c# file sorting radix-sort


【解决方案1】:

如果赋值中提到了数组和链表,那么看起来文件只是用来将数据读入数组或链表,然后排序完成,结果写入文件。

对于基于文件的基数排序,对于每个数字(从右到左),创建 10 个临时文件,根据数字读取数据并附加到文件“数字”,然后关闭 10 个临时文件,然后连接成一个工作文件,用于下一个基数排序步骤。对于每个字母,将使用 26 个临时文件。

【讨论】:

    猜你喜欢
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 2013-09-20
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多