Выполнить сортировку данных с помощью метода вставки с убывающим шагом - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Пусть даны три файла вещественных чисел, состоящих из 100, 1000 и 10000 чисел. Выполнить сортировку данных с помощью метода вставки с убывающим шагом. Определить количество операций сравнения для каждого из трёх файлов. Оценить эффективность метода, используя разные последовательности шагов.

Решение задачи: «Выполнить сортировку данных с помощью метода вставки с убывающим шагом»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. //-----------------------------------------------------------------------------
  5. size_t ShellSort(float array[], size_t size) {
  6.     int i, j, x;
  7.     size_t count = 0;
  8.     size_t step = size / 2;
  9.  
  10.     for (; step; step /= 2) {
  11.         for (i = step; i < size; ++i) {
  12.             x = array[i];
  13.             for (j = i - step; (x < array[j]) && (j >= 0); j -= step) {
  14.                 array[j + step] = array[j];
  15.                 count++;
  16.             }
  17.             array[j + step] = x;
  18.             count++;
  19.         }
  20.     }
  21.  
  22.     return count;
  23. }
  24. //-----------------------------------------------------------------------------
  25. size_t Load(FILE* f, float array[], size_t size) {
  26.     size_t i;
  27.     rewind(f);
  28.     for (i = 0; (i < size) && (fscanf(f, "%f", &array[i]) == 1); ++i) { ; }
  29.  
  30.     return i;
  31. }
  32. //-----------------------------------------------------------------------------
  33. void Print(float array[], size_t size) {
  34.     size_t i;
  35.     for (i = 0; i < size; ++i) {
  36.         printf("%.2f ", array[i]);
  37.     }
  38.     printf("\n");
  39. }
  40. //-----------------------------------------------------------------------------
  41. int Exec(FILE* f, float array[], size_t length) {
  42.     size_t size = Load(f, array, length);
  43.     printf("%u elements, %u comparisons:\n", size, ShellSort(array, size));
  44.     Print(array, size);
  45.  
  46.     return size == length;
  47. }
  48. //-----------------------------------------------------------------------------
  49.  
  50. int main(int argc, char* argv[]) {
  51.     float array[10000];
  52.     FILE* f;
  53.  
  54.     if (argc != 2) {
  55.         fprintf(stderr, "Usage: %s <FILE>\n", argv[0]);
  56.         return EXIT_FAILURE;
  57.     }
  58.  
  59.     if ((f = fopen(argv[1], "r")) == NULL) {
  60.         perror(argv[1]);
  61.         return EXIT_FAILURE;
  62.     }
  63.  
  64.     if (Exec(f, array, 100) == 0) {
  65.         return EXIT_FAILURE;
  66.     }
  67.  
  68.     if (Exec(f, array, 1000) == 0) {
  69.         return EXIT_FAILURE;
  70.     }
  71.  
  72.     if (Exec(f, array, 10000) == 0) {
  73.         return EXIT_FAILURE;
  74.     }
  75.  
  76.     fclose(f);
  77.  
  78.     return EXIT_SUCCESS;
  79. }

Объяснение кода листинга программы

  1. В функции ShellSort происходит сортировка массива методом вставки с убывающим шагом.
  2. В функции Load считываются числа из файла в массив до тех пор, пока не будет достигнут конец файла или не будет заполнено определенное количество элементов.
  3. В функции Print элементы массива выводятся на экран через пробел.
  4. В функции Exec происходит чтение данных из файла, сортировка и вывод на экран, а также проверяется, были ли прочитаны все элементы.
  5. В функции main создается массив и открывается файл для чтения.
  6. Если файл не открыт, то выводится сообщение об ошибке и программа завершается.
  7. Если файл открыт, то происходит попытка считать данные и выполнить сортировку с разным размером массива.
  8. Если сортировка не удалась, то выводится сообщение об ошибке и программа завершается.
  9. Если все проверки пройдены успешно, то файл закрывается и программа завершается.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы