面试时被问到单链表快速排序的问题,回来仔细实现下,面试时细节没有处理好只说出来一些思想。本人菜鸟请大家指教。
#include <iostream>
using namespace std;
typedef struct linklist
{
int key;
linklist *next;
}*listPoint;
void QuickSort(linklist *head,linklist * tail)
{
// 递归结束条件:当只有head 与tail元素时结束,因为每次我们传进来mid 其实mid已经不用排序,如果只有两个元素而mid不需要排序则递归结束
if (head->next==tail)
{
return ;
}
//p 连接的是比mid 小的值的链表,q连接是比mid 大值的链表并且包括mid
listPoint mid=head->next;
listPoint p=head;
listPoint q=mid;
listPoint t=mid->next;
int pivot=mid->key;
while (t!=tail)
{
if (t->key<pivot)
{
p=p->next=t;
}
else
{
q=q->next=t;
}
t=t->next;
}
// p链表连接上q链表
p->next=mid;
q->next=tail;//q链表尾部指向NULL
QuickSort(head,mid);//递归调用QuickSort
QuickSort(mid,tail);
}
void PrintList(listPoint head)
{
while (head->next)
{
cout<<head->next->key<<" ";
head=head->next;
}
cout<<endl;
}
listPoint listInsert(listPoint head,int val)
{
listPoint p=head;
while (p->next)
{
p=p->next;
}
listPoint Node=new linklist;
Node->key=val;
Node->next=NULL;
p->next=Node;
return head;
}
int main()
{
int a[10]={4,3,2,1,0,6,5,2};
listPoint head=new linklist;
head->next=NULL;
//建立带头结点的链表,head 中不存储数值
for (int i=0;i<8;i++)
{
head=listInsert(head,a[i]);
}
PrintList(head);
cout<<"after QuickSort ...\n";
QuickSort(head,NULL);// tail 指向NULL
PrintList(head);
return 0;
}