Сортировка Шелла - C (СИ) (151816)
Формулировка задачи:
Написать функцию сортировки методом Шелла, значения расстояния d в ходе работы функции должны образовывать последовательность Фибоначчи, начиная с максимального числа Фиббоначи, меньшего n(количества элементов последовательности)
Решение задачи: «Сортировка Шелла»
textual
Листинг программы
void ShellsSort(Type *a, unsigned n) { unsigned i, j, *h; int t; t = (unsigned) (log((double) n) / log(3.0) -1); t+=1; h = (unsigned *) calloc(t, sizeof(unsigned)); h[0] = 1; for (i = 1; i < t+1; i++) h[i] = h[i - 1] * 3 + 1; for (; t >= 0; t--) { for (i = 0; i+h[t] < n; i++) { for (j = 0; j + h[t] < n ; j++) if (a[j] > a[j + h[t]]) Swap(&a[j], &a[j + h[t]]); } } }
Объяснение кода листинга программы
- В функции
ShellsSort
определен типType
(вероятно, это должен быть тип данных, который может хранить значения элементов массива). - Переменная
n
инициализируется значением размера массиваa
. - В функции используется переменная
t
, которая инициализируется значением степени двойки, логарифм которой равен логарифму числаn
по основанию 3 (предполагается, чтоn
всегда больше 1). - Переменная
h
инициализируется значением массива, выделенного динамически с помощьюcalloc
, который будет использоваться для хранения значений, полученных из вычисленияh[i] = h[i - 1] * 3 + 1
. - Значение первого элемента массива
h
устанавливается равным 1. - В цикле
for
с переменнойi
от 1 доt+1
происходит вычисление значений элементов массиваh
с помощью формулыh[i] = h[i - 1] * 3 + 1
. - В цикле
for
с переменнойt
от 0 доlog2(n)
(предполагается, чтоn
всегда больше 1) происходит сортировка массиваa
с помощью алгоритма сортировки Шелла. - Внутренний цикл
for
с переменнойi
от 0 доn-h[t]
выполняется до тех пор, пока не будет выполнено условиеi+h[t] < n
, т.е. пока не будет достигнут конец массиваa
. - Во внутреннем цикле
for
с переменнойj
от 0 доn-h[t]
происходит сравнение элементов массиваa
и, если элементa[j]
больше элементаa[j+h[t]]
, выполняется обмен элементов с помощью функцииSwap
. - Если значение переменной
t
больше или равно 0, то циклfor
завершается. - Если значение переменной
t
меньше 0, то происходит освобождение памяти, выделенной под массивh
, с помощью функцииfree
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д