Сортировка Шелла - C (СИ) (155322)

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

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

Мне нужно отсортировать массив на 500 элементов, который создается рандомно, используя сортировку Шелла. При этом нужно посчитать кол-во сравнений, проходов и перестановок.Вот код:
#include <stdio.h> 
#include <stdlib.h>
 
void shell_sort(int array[], int size) 
{
int temp, gap, i, exchange_occurred;
int perestanovka;
gap = size / 2;// шаг 
int pr=0;
int sravnenia=0;
do {    pr=pr+1;// здесь мы подсчитываем кол-во проходов?
 do {sravnenia=sravnenia+1;//а здесь мы подсчитываем кол-во сравнений?
 exchange_occurred = 0;//
int perestanovka=0;
 for (i = 0; i < size - gap; i++) 
 if (array[i] > array[i + gap]) 
 {
 temp = array[i];
 array[i] = array[i + gap];
 array[i + gap] = temp;
 exchange_occurred = 1;
 perestanovka=perestanovka+1;
 }
 } while (exchange_occurred);
 
 } while (gap = gap / 2);
 
}
 
void main(void) 
{
int values[500], i;
for (i = 0; i < 500; i++) 
values[i] = rand() % 1000;
shell_sort(values, 500);
getchar();
int perestanovka;
int sravnenia;
int pr;
printf("Кол-во перестановок = %d ", perestanovka);
printf("Кол-во сравнений = %d ", sravnenia);
printf("Кол-во проходов = %d ", pr);
getchar();
}
Теперь вопросы: 1. Правильно ли я посчитала кол-во сравнений, проходов и перестановок? 2.Что нужно сделать, чтобы на строчках "printf("Кол-во перестановок = %d ", perestanovka); printf("Кол-во сравнений = %d ", sravnenia); printf("Кол-во проходов = %d ", pr);" не вылезала ошибка типа "Run-Time Check Failure #3 - The variable 'perestanovka' is being used without being initialized."

Решение задачи: «Сортировка Шелла»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
 
struct TInfo
{
   int perestanovka;
   int pr;
   int sravnenia;
};
 
struct TInfo shell_sort(int array[], int size)
{
   int temp, gap, i, exchange_occurred;
   struct TInfo info = {0, 0, 0};
   gap = size / 2;// шаг
   do
   {
      do
      {
         info.pr++; // Подсчитываем кол-во проходов
         exchange_occurred = 0;//
         for (i = 0; i < size - gap; i++)
         {
            info.sravnenia++; //Подсчитываем кол-во сравнений
            if (array[i] > array[i + gap])
            {
               temp = array[i];
               array[i] = array[i + gap];
               array[i + gap] = temp;
               exchange_occurred = 1;
               info.perestanovka++; //Подсчитываем кол-во перестановок
            }
         }
      }
      while (exchange_occurred);
   }
   while (gap = gap / 2);
 
   return info;
}
 
int main(void)
{
   int values[500], i;
   for (i = 0; i < 500; i++)
   {
      values[i] = rand() % 1000;
   }
   struct TInfo info = shell_sort(values, 500);
 
   printf("Кол-во перестановок = %d\n", info.perestanovka);
   printf("Кол-во сравнений = %d\n", info.sravnenia);
   printf("Кол-во проходов = %d\n", info.pr);
 
   getchar();
 
   return 0;
}

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

  1. Включаем необходимые заголовочные файлы: и
  2. Объявляем структуру TInfo, которая содержит поля: perestanovka, pr, sravnenia.
  3. Определяем функцию shell_sort, которая принимает массив целых чисел и его размер.
  4. Внутри функции определяем переменные: temp, gap, i, exchange_occurred и инициализируем их значения.
  5. Задаем начальное значение gap равное размеру массива деленному на 2.
  6. Запускаем цикл do-while, который выполняется до тех пор, пока gap не станет равным 1.
  7. Внутри цикла do-while запускаем внутренний цикл do-while, который выполняет сортировку по методу Шелл.
  8. Обновляем значения переменных info.pr, info.sravnenia и info.perestanovka.
  9. Выводим результаты сортировки на экран.
  10. В функции main создаем массив значений и заполняем его случайными числами.
  11. Вызываем функцию shell_sort для сортировки массива values.
  12. Выводим результаты работы функции shell_sort на экран.
  13. Ждем нажатия клавиши и завершаем работу программы.

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


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

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

10   голосов , оценка 4.2 из 5