我试图弄清楚如何按升序对双向链表进行排序但不能绕过它。对于我的标题,我有以下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;
}
}
答案 0 :(得分:0)
选择排序基本上找到列表其余部分中的最小元素,并将其与排序列表的末尾交换,从概念上从左向右移动,直到到达列表的末尾。在外循环的第一次传递之后,列表的第一个元素具有最低值。 Wikipedia有一些优秀的选择排序动画。
您需要一个指针来跟踪从持有者开始的最低值的节点。
IntNode *min = holder;
然后,如果当前节点temp小于min,则将min更新为指向temp。在内部for循环之后,你只需要交换min和holder,如果它们不相同,那么列表其余部分中的最小元素现在位于排序列表的末尾。