Сортировка Шелла - 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.