Сортировка линейным выбором - 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;
}

Решение задачи: «Сортировка линейным выбором»

textual
Листинг программы
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 не станет пустым, что означает, что все элементы были отсортированы.

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


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

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

7   голосов , оценка 3.714 из 5
Похожие ответы