Сортировка Шелла - 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 на экран.
- Ждем нажатия клавиши и завершаем работу программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д