单向链表的快速排序
typedef struct LIST
{
int value; //value只是个代表
struct LIST* next;
}list;
void quicksort(list* head,list* tail);
list* partition(list* head,list* tail);
void quicksort(list* head,list* tail) //head是头指针,不参与排序
{
list *l;
if (head->next==tail||head==tail)
return;
l=partition(head,tail); //l->next已经排好序了
quicksort(head,l);
quicksort(l->next,tail);
}
list* partition(list* head,list* tail)
{
list *p1,*p2,*p3;
p1=head->next,p2=tail;
while (p2->next!=p1)
{
while(p1->value<tail->value)p1=p1->next;
while (p2->value>=tail->value&&p2!=head)
{
for(p3=p2,p2=head;p2->next!=p3;p2=p2->next); //单向链表的悲剧,p2=p2->pre
}
if(p2->next!=p1) //p1,p2值互换
{
p1->value+=p2->value;
p2->value=p1->value-p2->value;
p1->value-=p2->value;
}
}
if(p1==tail) //p1是尾指针?是:返回p2;否:p1和tail值互换后返回p2
return p2;
p1->value+=tail->value;
tail->value=p1->value-tail->value;
p1->value-=tail->value;
return p2;
}
[ 本帖最后由 leaf_yyl 于 2011-8-17 21:10 编辑 ]
typedef struct LIST
{
int value; //value只是个代表
struct LIST* next;
}list;
void quicksort(list* head,list* tail);
list* partition(list* head,list* tail);
void quicksort(list* head,list* tail) //head是头指针,不参与排序
{
list *l;
if (head->next==tail||head==tail)
return;
l=partition(head,tail); //l->next已经排好序了
quicksort(head,l);
quicksort(l->next,tail);
}
list* partition(list* head,list* tail)
{
list *p1,*p2,*p3;
p1=head->next,p2=tail;
while (p2->next!=p1)
{
while(p1->value<tail->value)p1=p1->next;
while (p2->value>=tail->value&&p2!=head)
{
for(p3=p2,p2=head;p2->next!=p3;p2=p2->next); //单向链表的悲剧,p2=p2->pre
}
if(p2->next!=p1) //p1,p2值互换
{
p1->value+=p2->value;
p2->value=p1->value-p2->value;
p1->value-=p2->value;
}
}
if(p1==tail) //p1是尾指针?是:返回p2;否:p1和tail值互换后返回p2
return p2;
p1->value+=tail->value;
tail->value=p1->value-tail->value;
p1->value-=tail->value;
return p2;
}
[ 本帖最后由 leaf_yyl 于 2011-8-17 21:10 编辑 ]