Сортировка Шелла - C (СИ) (155322)
Формулировка задачи:
Мне нужно отсортировать массив на 500 элементов, который создается рандомно, используя сортировку Шелла. При этом нужно посчитать кол-во сравнений, проходов и перестановок.Вот код:Теперь вопросы:
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."
#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();
}Решение задачи: «Сортировка Шелла»
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;
}
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы:
и - Объявляем структуру TInfo, которая содержит поля: perestanovka, pr, sravnenia.
- Определяем функцию shell_sort, которая принимает массив целых чисел и его размер.
- Внутри функции определяем переменные: temp, gap, i, exchange_occurred и инициализируем их значения.
- Задаем начальное значение gap равное размеру массива деленному на 2.
- Запускаем цикл do-while, который выполняется до тех пор, пока gap не станет равным 1.
- Внутри цикла do-while запускаем внутренний цикл do-while, который выполняет сортировку по методу
Шелл. - Обновляем значения переменных info.pr, info.sravnenia и info.perestanovka.
- Выводим результаты сортировки на экран.
- В функции main создаем массив значений и заполняем его случайными числами.
- Вызываем функцию shell_sort для сортировки массива values.
- Выводим результаты работы функции shell_sort на экран.
- Ждем нажатия клавиши и завершаем работу программы.