Восходящий вид односвязного списка

Я работаю над этой программой, которая сортирует список. но проблема в том, что элемент в голове будет проигнорирован во втором рекурсивном вызове. Эс:

input: 7->1->8->0->NULL OUTPUT: 1->0->7->8->NULL. 

почему 1 игнорируется?

это структура узла:

struct nodo {
    int elem;
    struct nodo *next;
};

и функция:

struct nodo *ordinaLista(struct nodo *head) {
    //in ordine crescente

    if (!head)
        return NULL;
    else {
        if ((head->next) && (head->elem >= head->next->elem)) {
            int tmp = head->elem;
            head->elem = head->next->elem;
            head->next->elem = tmp;
        }
        //printList(head);
        
        head->next = ordinaLista(head->next); 
        head->next = ordinaLista(head->next);
    }
    return head;
}

Это недопустимый алгоритм сортировки. После выполнения этого элемента head может быть только один из двух первых элементов в исходном списке. Даже если бы это был правильный алгоритм, он работает за экспоненциальное время. Переключитесь на известный алгоритм, такой как сортировка слиянием, сортировка выбором и т. д.

interjay 21.06.2023 11:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
51
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Ваша функция неправильно сортирует список: вы сортируете только первые 2 элемента и переходите к сортировке остальной части списка.

Для упрощенной реализации с экспоненциальной сложностью O(n!), вы должны сначала отсортировать остальную часть списка, затем потенциально поменять местами 2 начальных элемента, гарантируя, что первый элемент будет наименьшим, наконец, если элементы были заменены местами, повторно отсортировать остальную часть списка.

Вот модифицированная версия:

struct nodo *ordinaLista(struct nodo *head) {
    //in ordine crescente

    if (head && head->next) {
        head->next = ordinaLista(head->next); 
        if (head->elem > head->next->elem) {
            int tmp = head->elem;
            head->elem = head->next->elem;
            head->next->elem = tmp;
            head->next = ordinaLista(head->next);
        }
    }
    return head;
}

Это имеет экспоненциальную сложность.

interjay 21.06.2023 11:24

@interjay: действительно так... ответ исправлен.

chqrlie 21.06.2023 13:54

Это лучшее решение без изменения моей первоначальной «логики». Оно работает. Спасибо

Luigi V. 21.06.2023 15:12

Смоделируем процедуру сортировки:

7->1->8->0->НОЛЬ

1->7->8->0->НОЛЬ

На самом деле достаточно смоделировать первый шаг. Как видите, узел «1» переставляется на первую позицию, а затем программа продолжает выполняться в обратном порядке, а «1» игнорируется. На самом деле ваш алгоритм сортировки неверен. Ваш алгоритм сортировки на самом деле является «пузырем». Для завершения сортировки требуется многократное барботирование. Для конкретного алгоритма вы можете обратиться к «сортировке пузырьком».

Проблема с вашей функцией заключается в том, что вы на самом деле не выполняете сортировку. Ваша функция просто меняет значение целого числа на следующее, если оно больше.

Таким образом, на одной итерации вам гарантируется, что последний элемент в списке будет самым большим.

Почему вы вызываете функцию рекурсивно дважды? Это действие кажется мне странным.

PS: избегайте комментариев к коду на итальянском, английский всегда предпочтительнее

Другие вопросы по теме