Выполнить сортировку данных с помощью метода вставки с убывающим шагом - C (СИ)
Формулировка задачи:
Пусть даны три файла вещественных чисел, состоящих из 100, 1000 и 10000 чисел. Выполнить сортировку данных с помощью метода вставки с убывающим шагом. Определить количество операций сравнения для каждого из трёх файлов. Оценить эффективность метода, используя разные последовательности шагов.
Решение задачи: «Выполнить сортировку данных с помощью метода вставки с убывающим шагом»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
//-----------------------------------------------------------------------------
size_t ShellSort(float array[], size_t size) {
int i, j, x;
size_t count = 0;
size_t step = size / 2;
for (; step; step /= 2) {
for (i = step; i < size; ++i) {
x = array[i];
for (j = i - step; (x < array[j]) && (j >= 0); j -= step) {
array[j + step] = array[j];
count++;
}
array[j + step] = x;
count++;
}
}
return count;
}
//-----------------------------------------------------------------------------
size_t Load(FILE* f, float array[], size_t size) {
size_t i;
rewind(f);
for (i = 0; (i < size) && (fscanf(f, "%f", &array[i]) == 1); ++i) { ; }
return i;
}
//-----------------------------------------------------------------------------
void Print(float array[], size_t size) {
size_t i;
for (i = 0; i < size; ++i) {
printf("%.2f ", array[i]);
}
printf("\n");
}
//-----------------------------------------------------------------------------
int Exec(FILE* f, float array[], size_t length) {
size_t size = Load(f, array, length);
printf("%u elements, %u comparisons:\n", size, ShellSort(array, size));
Print(array, size);
return size == length;
}
//-----------------------------------------------------------------------------
int main(int argc, char* argv[]) {
float array[10000];
FILE* f;
if (argc != 2) {
fprintf(stderr, "Usage: %s <FILE>\n", argv[0]);
return EXIT_FAILURE;
}
if ((f = fopen(argv[1], "r")) == NULL) {
perror(argv[1]);
return EXIT_FAILURE;
}
if (Exec(f, array, 100) == 0) {
return EXIT_FAILURE;
}
if (Exec(f, array, 1000) == 0) {
return EXIT_FAILURE;
}
if (Exec(f, array, 10000) == 0) {
return EXIT_FAILURE;
}
fclose(f);
return EXIT_SUCCESS;
}
Объяснение кода листинга программы
- В функции ShellSort происходит сортировка массива методом вставки с убывающим шагом.
- В функции Load считываются числа из файла в массив до тех пор, пока не будет достигнут конец файла или не будет заполнено определенное количество элементов.
- В функции Print элементы массива выводятся на экран через пробел.
- В функции Exec происходит чтение данных из файла, сортировка и вывод на экран, а также проверяется, были ли прочитаны все элементы.
- В функции main создается массив и открывается файл для чтения.
- Если файл не открыт, то выводится сообщение об ошибке и программа завершается.
- Если файл открыт, то происходит попытка считать данные и выполнить сортировку с разным размером массива.
- Если сортировка не удалась, то выводится сообщение об ошибке и программа завершается.
- Если все проверки пройдены успешно, то файл закрывается и программа завершается.