Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 21.10.2021
Сообщений: 38

Сортировка слиянием из 4 файлов

03.11.2022, 15:45. Показов 1182. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не могли бы подсказать алгоритм, но в лучшем случае код, как из 4 файла отсортировать слиянием в 5 файл. Я знаю что нужно взять первые числа все 4 файлов и потом сравнить между собой и наименьший вписать в 5 файл. А дальше как. Буду благодарен даже псевдокоду.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.11.2022, 15:45
Ответы с готовыми решениями:

Сортировка слиянием
Есть желающие реализовать сортировку слиянием без рекурсии (generic, iterative merge-sort), с обобщёнными типами и с перегрузкой для...

Сортировка слиянием
Реализовал сортировку слиянием на C#. Проблема в том, что от 1 до 40 элементов сортирует быстро. Если задать больше, то сортирует очень...

Сортировка слиянием
Пытаюсь реализовать сортировку слиянием, функция merge написана правильно. Не понимаю как реализовать саму функцию сортировки, постоянно...

17
 Аватар для iLinks
800 / 458 / 237
Регистрация: 03.01.2017
Сообщений: 1,339
03.11.2022, 16:04
Допустим получили массивы из 4х файлов
Code
1
2
3
4
{89,40,62,75,51,68,18,69,90}
{12,99,88,77,94,21}
{50,68,4,85,25,29,5}
{54,80,2,14}
Как должен выглядеть массив для 5го файла?
0
0 / 0 / 0
Регистрация: 21.10.2021
Сообщений: 38
03.11.2022, 18:53  [ТС]
iLinks, сравниваем первые числа из всех файлов. Тобишь: 89, 12, 50, 54. Меньший это 12. Его и вписываем в 5 файл. Затем указатель смещается на следующее число в том файле где стоял прошлый наименьший элемент. То есть бы берем сл.числа: 89, 99,50,54. Меньший это 50. Его и вписываем в 5 файл. Указатель теперь в 3 файле. След.цифры которые мы будем сравнивать это: 89, 99, 68,54. И так далее. Как видите в алгоритме я разобрался. Буду благодарен если поможите с кодом
0
3260 / 3300 / 556
Регистрация: 17.02.2019
Сообщений: 5,196
03.11.2022, 19:23
Nolic12, файлы текстовые, цифры строкой или в столбик?
0
0 / 0 / 0
Регистрация: 21.10.2021
Сообщений: 38
03.11.2022, 19:28  [ТС]
iLinks, я в принципе плюс минус подумал как можно сделать. Открываю для каждого файла потоки для чтения. Вписываю в переменную типа int все значения и сразу конвертирую из string в int. И потом нужно с циклами наверное поиграться. Но как? Вот в чем вопрос. Создать один общий цикл в котором будут остольные 4 цикла для прохода по каждым этим переменным. И буду сравнивать и там где найду наименьший поставлю какую нибудь метку. Но до сколько будет ходить общий цикл. Как все сложно. Буду думать всю ночь

Добавлено через 29 секунд
January29, цифры в файле строкой
0
3260 / 3300 / 556
Регистрация: 17.02.2019
Сообщений: 5,196
03.11.2022, 21:20
Цитата Сообщение от Nolic12 Посмотреть сообщение
и наименьший вписать в 5 файл
Как то так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using System;
using System.IO;
using System.Linq;
 
static class ConsoleApp6
{
    static void Main()
    {
        // в массив запишем какие файлы считывать
        string[] nameFiles = { "Text1.txt", "Text2.txt", "Text3.txt", "Text4.txt" };
        string[] fiveArray = new string[nameFiles .Length ];
        for (int i = 0; i < nameFiles.Length; i++)
        {
            string t = File.ReadAllText(nameFiles[i]);
            int[] files = t.Split(new char[] { ',', ' ' },StringSplitOptions.RemoveEmptyEntries).Select(x => int.Parse(x)).ToArray();
            // если не надо в консоль выводить убираем
            Console.WriteLine($"В {i+1} файле \"{nameFiles[i]}\" {string .Join (", ",files)} минимальный {files .Min()}");
            fiveArray[i] = files.Min().ToString();
        }
        File.WriteAllText("five.txt",fiveArray .Min ()); // имя файла измените
        // File.WriteAllText("five.txt", string.Join(" ", fiveArray)); // если надо все минимальные записать
        Console.ReadLine();
    }
}
0
0 / 0 / 0
Регистрация: 21.10.2021
Сообщений: 38
03.11.2022, 22:06  [ТС]
January29, не то что нужно. Он ищет наименьший в каждом файле и потом эти наименьшие числа сравнивает между собой и ищет уже между ними самое маленькое. А мне нужно сравнить первые числа из каждого файла и наименьший из них записать в 5 файл. Пример как я бы хотел я подал немного выше. Но спасибо за помощь. Вы немного пролили свет на то в какую сторону мне двигаться
0
3260 / 3300 / 556
Регистрация: 17.02.2019
Сообщений: 5,196
03.11.2022, 22:37
Цитата Сообщение от Nolic12 Посмотреть сообщение
А мне нужно сравнить первые числа из каждого файла и наименьший из них записать в 5 файл.
ну если только первые из массивов чуток подправил
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
using System.IO;
using System.Linq;
 
static class ConsoleApp6
{
    static void Main()
    {
        // в массив запишем какие файлы считывать
        string[] nameFiles = { "Text1.txt", "Text2.txt", "Text3.txt", "Text4.txt" };
        int [] fiveArray = new int[nameFiles .Length ];
        for (int i = 0; i < nameFiles.Length; i++)
        {
            string t = File.ReadAllText(nameFiles[i]);
            int[] files = t.Split(new char[] { ',', ' ' },StringSplitOptions.RemoveEmptyEntries).Select(x => int.Parse(x)).ToArray();
            // если не надо в консоль выводить убираем
            Console.WriteLine($"В {i+1} файле \"{nameFiles[i]}\" {string .Join (", ",files)} минимальный {files .Min()}");
            fiveArray[i] = files[0];
        }
        File.WriteAllText("five.txt",fiveArray .Min ().ToString ()); // имя файла измените
        Console.ReadLine();
    }
}
0
0 / 0 / 0
Регистрация: 21.10.2021
Сообщений: 38
03.11.2022, 22:50  [ТС]
January29, я думаю что нужно создать какой нибудь внутрений цикл который будет добавлять в массив 1 числа всех файлов. И потом найти минимиальный из них и запомнить номер итерации. Номер итерации и будет нашим указателем. Потом как то по умному во внутренем цикле нужно написать что бы он увеличи итерацию только на том файле, на котором стоит указатель, а остальные не трогать.
Я тут что начирикал до момента когда нашел миниимальный в первых числах, для понимании моих мыслей, ну а дальше я же не знаю. могз кипит.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
 static void Main(string[] args)
        {
            double[] nums2 = new double [] { 2,3,17,7,8,9,1,4,6,9,2,3,1,18 };
            RecordFile(nums2); //это метод при помощи которого я вписываю изначальные числа по файлам, не обращайте внимания
 
            // в массив запишем какие файлы считывать
            string[] nameFiles = { "a.txt", "b.txt", "c.txt", "d.txt" };
            string[] fiveArray = new string[nameFiles.Length];
            int[] num = new int[4];//создаем массив с размерностью количеств наших файлов
 
            for (int i = 0; i < nameFiles.Length; i++)
            {
                string t = File.ReadAllText(nameFiles[i]);
                int[] files = t.Split(new char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries).Select(x => int.Parse(x)).ToArray();
                //тут в каждом файле находим первые элементы всех файлов и добовляем в массив
                for (int j = 0; j < files.Length; j++)
                {
                    num[i] = files[j];
                    break;
                }
 
 
                // если не надо в консоль выводить убираем
                Console.WriteLine($"В {i + 1} файле \"{nameFiles[i]}\" {string.Join(", ", files)} минимальный {files.Min()}");
                fiveArray[i] = files.Min().ToString();
               
            }
 
            //File.WriteAllText("e.txt", fiveArray.Min()); // имя файла измените
                                                            // File.WriteAllText("five.txt", string.Join(" ", fiveArray)); // если надо все минимальные записать
            int min = num[0], minIndex = 0;
        
            for (int r = 0; r < num.Length; r++)
            {
                if (min > num[r])
                {
                    min = num[r];
                    minIndex = r;
                }
            }
            Console.Write(min + "место=" + minIndex);
 
            Console.ReadLine();
 
        }
 
    }
}
0
3260 / 3300 / 556
Регистрация: 17.02.2019
Сообщений: 5,196
03.11.2022, 23:23
Nolic12, а с поста 8 не подходит код
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
04.11.2022, 02:50
iLinks, сортировка слиянием имеет смысл только если все исходные массивы отсортированы. Применяется в big data sort алгоритмах умеющих сортировать обьемы данных значительно превышающие обьем оперативной памяти.

Добавлено через 11 минут
Nolic12, в строке 25 кроме поиска минимального элемента надо знать и сам номер файла которому этот минимальный элемент принадледит, и с него дочитать следующее число. Процедуру повторять пока во всех файлах не закончатся числа.
Учти еще что я уже писал выше - сортировка слиянием не имеет смысла если каждый из массивов не отсортирован.
0
04.11.2022, 17:13

Не по теме:

nicolas2008, а я тут причем?

0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
04.11.2022, 18:08
iLinks, массивы в вашем примере неотсортированы
0
0 / 0 / 0
Регистрация: 21.10.2021
Сообщений: 38
04.11.2022, 20:07  [ТС]
nicolas2008, у меня многопутьевое слияние. Я в начале отправляю во все 4 файла отсортированные серии. И потом все это я должен слиять
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38203 / 21135 / 4310
Регистрация: 12.02.2012
Сообщений: 34,740
Записей в блоге: 14
04.11.2022, 20:33
Я не вникал в дискуссию. Но сливаемые файлы должны быть отсортированы (сами по себе). Иначе их не сольешь
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
04.11.2022, 20:35
Nolic12, та я понял.
Не уверен что код будет понятнее, но держите, нашел в своих архивах.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
        void Test()
        {
             var file1 = new int[] { 1, 3, 5, 6 };
             var file2 = new int[] { 3, 4, 5, 7 };
             var file3 = new int[] { 1, 5, 7, 9 };
             var file4 = new int[] { 11, 12, 13, 14 };
 
             var mergedSorted = HeapMergeSort(new [] { file1, file2, file3, file4 }).ToArray();
        }
 
        private IEnumerable<T> HeapMergeSort(IEnumerable<T>[] streams)
        {
                IEnumerator<T>[] enumerators = new IEnumerator<T>[streams.Length];
                for (int i = 0; i < streams.Length; i++)
                {
                    enumerators[i] = streams[i].GetEnumerator();
                }
                
                var mergeSortMinHeap = new SortedLookup<T, int>(Comparer<T>.Default);
 
                for (int i = 0; i < enumerators.Length; ++i)
                {
                    var enumerator = enumerators[i];
                    if (enumerator.MoveNext())
                    {
                        mergeSortMinHeap.Put(enumerator.Current, i);
                    }
                }
 
                while (mergeSortMinHeap.Count != 0)
                {
                    var kvp = mergeSortMinHeap.First();
                    var value = kvp.Key;
                    var streamIndexes = kvp.Value;
 
                    mergeSortMinHeap.Remove(value);
                    foreach (var streamIndex in streamIndexes)
                    {
                        yield return value;
                    }
 
                    foreach (var streamIndex in streamIndexes)
                    {
                        var enumerator = enumerators[streamIndex];
                        if (enumerator.MoveNext())
                        {
                            mergeSortMinHeap.Put(enumerator.Current, streamIndex);
                        }
                    }
                }
            
        }
 
    public class SortedLookup<TKey, TValue>
    {
        private readonly SortedDictionary<TKey, Values<TValue>> sortedDictionary;
 
        public int Count => this.sortedDictionary.Count;
 
        public SortedLookup(IComparer<TKey> keyComparer)
        {
            this.sortedDictionary = new SortedDictionary<TKey, Values<TValue>>(keyComparer);
        }
        
        public void Put(TKey key, TValue value)
        {
            if (sortedDictionary.TryGetValue(key, out Values<TValue> valueStorage))
            {
                valueStorage.Add(value);
            }
            else
            {
                sortedDictionary.Add(key, new Values<TValue>(value));
            }
        }
 
        public void Remove(TKey key)
        {
            sortedDictionary.Remove(key);
        }
 
        public KeyValuePair<TKey, Values<TValue>> First()
        {
            return sortedDictionary.First();
        }
        
        public class Values<T> : IEnumerable<T>
        {
            private readonly T firstValue;
        
            private List<T> nextValues;
 
            public Values(T value)
            {
                this.firstValue = value;
            }
 
            public void Add(T value)
            {
                if (nextValues == null)
                {
                    nextValues = new List<T>(4);
                }
 
                nextValues.Add(value);
            }
 
            public IEnumerator<T> GetEnumerator()
            {
                yield return firstValue;
 
                if (nextValues != null)
                {
                    foreach (var value in nextValues)
                    {
                        yield return value;
                    }
                }
            }
 
            IEnumerator IEnumerable.GetEnumerator()
            {
                return GetEnumerator();
            }
        }
    }
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38203 / 21135 / 4310
Регистрация: 12.02.2012
Сообщений: 34,740
Записей в блоге: 14
05.11.2022, 14:41
Цитата Сообщение от iLinks Посмотреть сообщение
Допустим получили массивы из 4х файлов
КодВыделить код
{89,40,62,75,51,68,18,69,90}
{12,99,88,77,94,21}
{50,68,4,85,25,29,5}
{54,80,2,14}
Как должен выглядеть массив для 5го файла?
- никак. Исходные данные не отсортированы
0
06.11.2022, 23:38

Не по теме:

nicolas2008, Catstail, ещё раз, я тут причем? Или вы думаете, что я не знаю что такое сортировка слиянием? ТС не привел пример, я уточнил, т.к. тут много тем, где ТС сам не знает чего хочет.
P.S. в новой теме ТС взял мой пример за основу.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.11.2022, 23:38
Помогаю со студенческими работами здесь

Сортировка слиянием
Уважаемые программисты, помогите, пожалуйста, написать прогу на C# с комментариями. Нужна программа &quot;Сортировка слиянием&quot;....

Сортировка слиянием
Как найти left and right public static void MergeSort(int input, int left, int right) { if (left &lt; right) { int...

Сортировка слиянием
Помогите пожалуйса! Ошибка: process is terminated due to stackoverflowexception static List&lt;string&gt; M_sort(List&lt;string&gt; stm1) ...

Сортировка массива слиянием
Здравствуйте, помогите написать программу которая сортирует одномерный массив слиянием. Заранее спасибо.

Нужна сортировка слиянием
Помогите


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru