不知道如何对双向链表进行排序?

Posted

技术标签:

【中文标题】不知道如何对双向链表进行排序?【英文标题】:Can't figure out how to sort a doubly linked list? 【发布时间】:2014-03-01 04:15:53 【问题描述】:

我试图弄清楚如何按升序对双向链表进行排序,但无法理解它。对于我的标题,我有以下内容,其中 select_sort 是对其进行排序的函数。

#ifndef INTLIST_H
#define INTLIST_H

struct IntNode
    int data;
    IntNode *next;
    IntNode(int data) : data(data), next(0) 
;

class IntList
private:
    IntNode *head;
    IntNode *tail;
public:
    void select_sort();

编辑:

我的可怕功能

void IntList::select_sort()
    for(IntNode *holder = head; holder != NULL; holder = holder -> next)
            IntNode *temp2 = holder;
            for(IntNode *temp = holder -> next; temp!=NULL;temp = temp->next)
                if(temp2 -> data > temp -> data)
                    temp2 = temp;
                
            
            int holder2 = tail -> data;
            tail -> data = temp2 -> data;
            temp2 -> data = holder2;
    

【问题讨论】:

你尝试了什么? 添加了我可怕的功能 因为你的数据只是整数,你应该使用bucket sort算法。桶排序对于链表来说特别容易实现,而且它还具有 O(n) 的计算复杂度,有些人会告诉你这是不可能的,所以它非常适合用它来赢得争论。 【参考方案1】:

选择排序基本上是在列表的其余部分中找到最小的元素并将其与排序列表的末尾交换,从概念上讲是从左到右移动直到到达列表的末尾。在外循环的第一遍之后,列表的第一个元素具有最低值。 Wikipedia 有一些出色的选择排序动画。

您需要一个指针来跟踪从 holder 开始的具有最低值的节点。

IntNode *min = holder;

如果当前节点 temp 小于 min,则更新 min 以指向 temp。在内部 for 循环之后,您只需交换 min 和 holder 如果它们不相同,那么列表其余部分中的最小元素现在位于排序列表的末尾。

【讨论】:

我用修改后的函数编辑了我的 q,但它不能正常工作 你需要交换 holder->data 和 temp2->data。您在 holder 和 tail(包括)之间的子列表中找到最小的节点,然后将其与 holder 交换。

以上是关于不知道如何对双向链表进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

双向链表排序c语言程序设计

如何在双向链表 C++ 上使用插入排序?

如何在 O(n) 时间内对双向链表进行二进制搜索?

经典算法学习——非循环双向链表实现冒泡排序(不带头结点)

二叉搜索树与双向链表

双向链表