无法弄清楚如何对双向链表进行排序?

时间:2014-03-01 04:15:53

标签: c++ sorting

我试图弄清楚如何按升序对双向链表进行排序但不能绕过它。对于我的标题,我有以下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;
    }
}

1 个答案:

答案 0 :(得分:0)

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

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

IntNode *min = holder;

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