面试算法题-单链表的快速排序实现

面试时被问到单链表快速排序的问题,回来仔细实现下,面试时细节没有处理好只说出来一些思想。本人菜鸟请大家指教微笑

#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;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值