算法思想:对于一个链表,以head节点的值作为key,然后遍历之后的节点,可以得到一个小于key的链表和大于等于key的链表;由此递归可以对两个链表分别进行快速。这里用到了快速排序的思想即经过一趟排序能够将小于key的元素放在一边,将大于等于key的元素放在另一边;
面试回答:如果面试官问快速排序是否适合单链表,答案当然是不适合;但是如果问单链表可不可以用快速排序,答案当然是肯定的;下面贴出一段拙劣的代码,希望大家修正!
Code:
void QuickSort(LinkNode ** head){
if(*head==NULL)
return ;
//记录每次分割后,前后两个链表的头结点,pre1、pre2每次比较时都成为尾结点。
LinkNode* head1=NULL,*head2=NULL,*pre1=NULL,*pre2=NULL;
int key = (*head)->value; //将head的值孤立起来,不存到左边,也不存到右边
LinkNode* cur=(*head)->next; //记录当前结点
while(cur!=NULL){
//小于key的链表
if(cur->value<key){
if(head1==NULL){
head1=cur;pre1=cur;
}else{
pre1->next=cur;
pre1=cur;
}
cur=cur->next;
pre1->next=NULL;//尾结点指向NULL
//大于等于key的链表
}else {
if(head2==NULL){
head2=cur;
pre2=cur;
}else {
pre2->next=cur;
pre2=cur;
}
cur=cur->next;
pre2->next=NULL;
}
}
//对左右两个链表进行队规快排
QuickSort(&head1);
QuickSort(&head2);
//从递归栈返回的时候,将key节点和左右两个链表进行连接
//左右链表都存在
if(pre1!=NULL&&head2!=NULL){
(*head)->next=head2;
pre1->next=*head;
*head=head1;
//只有做链表
}else if(pre1!=NULL){
pre1->next=*head;
*head=head1;
//只有右链表
}else if(head2!=NULL){
(*head)->next=head2;
}
}