Сортировка линейным выбором - C (СИ)
Формулировка задачи:
#include <stdio.h> #include <stdlib.h> typedef struct _Item { float _key; char _str[31]; } Item; typedef Item UDT_TYPE; typedef struct _Udt { UDT_TYPE *_data; int _capacity; int _size; } Udt; void udtCreate(Udt *udt, const int capacity); int udtPush(Udt *udt, const UDT_TYPE value); void udtPop(Udt *udt); UDT_TYPE udtTop(const Udt *udt); int udtSize(const Udt *udt); int udtEmpty(const Udt *udt); void udtPrint(Udt *udt); void udtDestroy(Udt *udt);
void udtSwap(Udt *udt1, Udt *udt2) { Udt tmp; tmp = *udt1; *udt1 = *udt2; *udt2 = tmp; } void udtSelectionSort(Udt *udt) { const int cap = udtCapacity(udt); Udt sorted, tmp; UDT_TYPE item; if (cap < 2) return; udtCreate(&sorted, cap); udtCreate(&tmp, cap); while (!udtEmpty(udt)) {
void udtCreate(Udt *udt, const int capacity) { int i; UDT_TYPE item; item._key = 0.0f; item._str[0] = '\0'; if (capacity <= 0) return; udt->_data = (UDT_TYPE *)malloc(sizeof(UDT_TYPE) * capacity); for (i = 0; i < capacity; i++) udt->_data[i] = item; udt->_capacity = capacity; udt->_size = 0; } int udtPush(Udt *udt, const UDT_TYPE value) { if (udt->_size == udt->_capacity) return 0; udt->_data[udt->_size++] = value; return 1; } void udtPop(Udt *udt) { if (udt->_size == 0) return; udt->_size--; } UDT_TYPE udtTop(const Udt *udt) { return udt->_data[udt->_size - 1]; } int udtSize(const Udt *udt) { return udt->_size; } int udtEmpty(const Udt *udt) { return udt->_size == 0; } void udtPrint(Udt *udt) { int i; Item item; printf("+-------+------------+------------------------------+\n"); printf("| Номер | Ключ | Строка |\n"); printf("+-------+------------+------------------------------+\n"); for (i = 0; i < udtSize(udt); i++) { item = udt->_data[i]; printf("|%7d|%12.2f|%30s|\n", i + 1, item._key, item._str); } printf("+-------+------------+------------------------------+\n"); } void udtDestroy(Udt *udt) { if (udt->_data != NULL) { free(udt->_data); udt->_data = NULL; } udt->_capacity = 0; udt->_size = 0; }
Решение задачи: «Сортировка линейным выбором»
while (!udtEmpty(udt)){ udtPush(&tmp, udtTop(udt)); udtPop(udt); while (!udtEmpty(udt)) { item = udtTop(udt); udtPop(udt); if (item._key < udtTop(&tmp)._key){ udtPush(&tmp1, udtTop(&tmp)); udtPop(&tmp); udtPush(&tmp, item);} else{udtPush(&tmp1, item);} } udtSwap(&tmp, &sorted);}
Объяснение кода листинга программы
В этом коде реализуется сортировка вставками с использованием двух очередей (udt и udt1) и одной временной структуры (tmp). Код начинается с цикла while, который продолжается до тех пор, пока udt не станет пустым. Внутри цикла, код берет верхний элемент из udt, помещает его в tmp, а затем удаляет его из udt. Затем, в цикле while, который продолжается до тех пор, пока udt не станет пустым, код берет верхний элемент из udt, помещает его в tmp, а затем удаляет его из udt. Затем, если элемент в udt меньше элемента в вершине tmp, код помещает элемент из udt в вершину tmp1, удаляет его из udt, а затем добавляет элемент в udt. Если элемент в udt больше или равен элементу в вершине tmp, код просто добавляет элемент в udt1. После завершения внутреннего цикла, код меняет местами udt и udt1, тем самым перемещая отсортированные элементы из udt1 в udt. Цикл while повторяется до тех пор, пока udt не станет пустым, что означает, что все элементы были отсортированы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д