You are on page 1of 9

Міністерство освіти і науки України

НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ


«ХАРКІВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ»

Навчально-науковий інститут комп'ютерних наук та інформаційних технологій

Кафедра «Обчислювальна техніка та програмування»

ЗВІТ

з дисципліни "АЛГОРИТМИ ТА СТРУКТУРИ ДАНИХ"

про виконання Практичної роботи №16

АЛГОРИТМИ ЗОВНІШНЬОГО СОРТУВАННЯ

Виконав: студент групи КН-1022В


Гасюк М.О.

Перевірив: Доцент ОТП


Бречко В.О.

Харків-2023
2

Мета: набути досвіду практичної роботи розв’язання задач з

використанням бінарних дерев.

Завдання №1.

Варіант 6
Код програми

using System;
using System.IO;
using System.Linq;

class Program
{
static void Main()
{
string inputFile = "input.txt";
string outputFile = "output.txt";
int fileCount = 3;

GenerateInputFile(inputFile, 1000);

CreateChunks(inputFile, fileCount);

MergeChunks(outputFile, fileCount);
}

static void GenerateInputFile(string filename, int length)


{
Random random = new Random();
File.WriteAllLines(filename, Enumerable.Range(0, length).Select(x => random.Next().ToString()));
}

static void CreateChunks(string inputFile, int fileCount)


{
var lines = File.ReadAllLines(inputFile);
int chunkSize = lines.Length / fileCount;

for (int i = 0; i < fileCount; i++)


{
var chunk = lines.Skip(i * chunkSize).Take(chunkSize).Select(int.Parse).ToArray();
HeapSort(chunk);
File.WriteAllLines($"file{i}.txt", chunk.Select(x => x.ToString()));
}
}

static void HeapSort(int[] array)


{
int n = array.Length;

for (int i = n / 2 - 1; i >= 0; i--)


3

Heapify(array, n, i);

for (int i = n - 1; i >= 0; i--)


{
Swap(array, 0, i);
Heapify(array, i, 0);
}
}

static void Heapify(int[] array, int n, int i)


{
int largest = i;
int left = 2 * i + 1;
int right = 2 * i + 2;

if (left < n && array[left] > array[largest])


largest = left;

if (right < n && array[right] > array[largest])


largest = right;

if (largest != i)
{
Swap(array, i, largest);
Heapify(array, n, largest);
}
}

static void Swap(int[] array, int i, int j)


{
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}

static void MergeChunks(string outputFile, int fileCount)


{
StreamWriter output = new StreamWriter(outputFile);
StreamReader[] readers = new StreamReader[fileCount];

try
{
for (int i = 0; i < fileCount; i++)
{
readers[i] = new StreamReader($"file{i}.txt");
}

while (true)
{
int min = int.MaxValue;
int minIndex = -1;

for (int i = 0; i < fileCount; i++)


{
if (readers[i] != null)
{
string line = readers[i].ReadLine();

if (line == null)
{
readers[i].Close();
readers[i] = null;
}
else
{
4

int value = int.Parse(line);

if (value < min)


{
min = value;
minIndex = i;
}
}
}
}

if (minIndex == -1)
{
break;
}

output.WriteLine(min);
}
}
finally
{
output.Close();

for (int i = 0; i < fileCount; i++)


{
readers[i]?.Close();
}
}
}
}
5

Рисунок 1.1 – Вхідний файл


6

Рисунок 1.2
7

Рисунок 1.3
8

Рисунок 1.4
9

Рисунок 1.5 Результат програми

You might also like