program H;
uses WinCrt, SysUtils;
const
min = 10;
max = 13;
maxHeap = 1 shl max;
type
heap = array [1..maxHeap] of integer;
heapBase = ^heap;
var
currentSize, heapSize: integer;
A: heapBase;
procedure SwapInts (var a, b: integer);
var
t: integer;
begin
t := a;
a := b;
b := t
end;
procedure InitHeap (size: integer);
var
i: integer;
begin
heapSize := size;
currentSize := size;
Randomize;
for i := 1 to size do
A^[i] := Random(size) + 1;
end;
procedure Heapify (i: integer);
var
left, right, largest: integer;
begin
largest := i;
left := 2 * i;
right := left + 1;
if left <= heapSize thenif A^[left] > A^[i] then
largest := left;
if right <= heapSize thenif A^[right] > A^[largest] then
largest := right;
if largest <> i thenbegin
SwapInts (A^[largest], A^[i]);
Heapify (largest)
endend;
procedure BuildHeap;
var
i: integer;
beginfor i := heapSize div 2 downto 1 do
Heapify (i)
end;
procedure HeapSort;
var
i: integer;
begin
BuildHeap;
for i := currentSize downto 2 dobegin
SwapInts (A^[i], A^[1]);
dec (heapSize);
Heapify (1)
endend;
type
TAvgTimes = array [min..max] of TDateTime;
var
sTime, eTime, tTime: TDateTime;
i, idx, size: integer;
avgTimes: TAvgTimes;
begin
tTime := 0;
i := min;
size := 1 shl min;
new (A);
while i <= max dobeginfor idx := 1 to 10 dobegin
InitHeap (size);
sTime := Time;
HeapSort;
eTime := Time;
tTime := tTime + (eTime - sTime)
end;
avgTimes[i] := tTime / 10.0;
inc (i);
size := size shl 1;
end;
end.
Программа на Delphi, которая реализует алгоритм сортировки heap для отсортирования массива целых чисел в обратном порядке, а затем измеряет среднее время выполнения этой операции для различных размеров входных массивов.
Вот разбивка кода:
Первая секция определяет константы для минимального и максимального размеров входных массивов, а также тип heap (массив целых чисел) и его базу.
Процедура SwapInts обменивает два значения целых чисел.
Процедура InitHeap инициализирует heap с заданным размером, случайно распределяя значения в heap.
Процедура Heapify рекурсивная функция, которая поддерживает свойство heap, перемещая наибольшее значение к корню heap и затем рекурсивно heapifying затронутого поддерева.
Процедура BuildHeap строит heap из массива, вызывая Heapify для каждого нелистевого узла в обратном порядке.
Процедура HeapSort сортирует массив с помощью алгоритма heap sort, который заключается в строительстве heap и затем повторно удалении наибольшего значения из heap и его размещении в конце массива.
В главной программной секции объявляется массив типа TAvgTimes, чтобы хранить средние времена для каждого размера входного массива. Затем программа проходит циклом через различные размеры входных массивов, инициализирует heap с этим размером, измеряет время выполнения сортировки с помощью процедуры HeapSort и хранит среднее время в массиве avgTimes.
Наконец, программа отображает средние времена для каждого размера входного массива.
Один из предложений - рассмотреть использование более эффективного алгоритма сортировки, чем heap sort для больших входных массивов. Heap sort имеет сложность времени O(n log n), что может быть медленным для больших вводов. Другие алгоритмы, такие как quicksort или mergesort, могут быть быстрее и более подходящими для больших вводов.
Кроме того, программа не обрабатывает исключения, такие как деление на ноль при расчете среднего времени для размера массива, равного 0. Хорошо было бы добавить код обработки ошибок для таких ситуаций.
В целом, программа appears to be well-structured and easy to follow, with clear variable names and comments. However, it could benefit from some additional testing and debugging to ensure that the results are accurate and reliable.
Сортировка StringGrid с целыми значениями: статья описывает алгоритм heapSort для сортировки целочисленных значений в StringGrid, реализованный на языке Delphi.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.