Корень сортировки в файле C# - PullRequest
2 голосов
/ 05 апреля 2020

Это задание из университета. Я должен сделать сортировку Radix на автомобильных регистрационных знаках (AB C 123) двумя способами: 1) массив 2) связанный список. Самое интересное, что сортировка должна выполняться в файле. Например, отныне мы будем говорить только о массиве. Я генерирую номера автомобилей и помещаю их в массив, затем с двоичной записью записываю все сгенерированные номера автомобилей в файл. После этого я передаю вновь сгенерированный файл в Radix Sort, и он должен сделать магию c. Я покажу вам код, который у меня есть на данный момент, но на самом деле это не «настоящая» сортировка по основанию, потому что мой разум не может понять, как я могу реализовать сортировку по основанию в файле. (Я реализовал сортировку по основанию для обычного массива и связанного списка, но когда это делается ВНУТРИ файла, это просто умопомрачительно). Я просто хотел спросить, есть ли у кого-нибудь из вас какие-либо советы или идеи о том, как я могу улучшить алгоритм сортировки, потому что он очень медленный. Спасибо.

PROGRAM.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);
    }
}

ARRAY.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);
}

1 Ответ

0 голосов
/ 07 апреля 2020

Если в назначении упоминается массив и связанный список, то может показаться, что файл используется только для чтения данных в массив или связанный список, тогда сортировка выполняется, и результат записывается в файл.

Для радикальной сортировки на основе файлов для каждого di git (справа налево) создается 10 временных файлов, данные считываются и добавляются в файл "di git" на основе di git. , затем 10 временных файлов закрываются, затем объединяются в один рабочий файл для следующего шага сортировки по основанию. Для каждой буквы будет использоваться 26 временных файлов.

...