单链表的快速排序算法

同学面试被问到了单链表的快排问题,发现这篇博客思想讲的不错,转载下,谢谢博主的分享。

源自:http://blog.csdn.net/panghuizl/article/details/6984026#comments

算法思想对于一个链表,以head节点的值作为key,然后遍历之后的节点,可以得到一个小于key的链表和大于等于key的链表;由此递归可以对两个链表分别进行快速。这里用到了快速排序的思想即经过一趟排序能够将小于key的元素放在一边,将大于等于key的元素放在另一边;

struct LinkNode{
	int value;
	LinkNode* next;
	LinkNode(): value(0), next(NULL) {};
};

void Quicksort(LinkNode* &head, LinkNode* &end){
	LinkNode *head1, *head2, *end1, *end2;	/*	记录每次分割后前后两个链表的头尾节点*/
	head1 =  head2 = end1 = end2  = NULL;	
	
	if( head == NULL ) return;	//如果遍历的当前节点为空,返回

	LinkNode *p, *pre1, *pre2;	/*用于遍历链表将链表中的元素分成大于key和小于key两个部分*/
	p = pre1 = pre2 = NULL;
	
	int key = head->value;
	p = head->next; head->next = NULL;	//将head的值孤立出来
	while( p != NULL ) {
		//小于key的链表
		if ( p->value < key ){
			if( !head1 ) { head1 = p; pre1 = p; }
			else{ pre1->next = p; pre1 = p; }
			p = p->next;
			pre1->next = NULL;
		}
		//大于等于key的链表
		else{
			if( !head2 ) { head2 = p; pre2 = p; }
			else { pre2->next = p; pre2 = p; }
			p = p->next;
			pre2->next = NULL;
		}
	}

	end1 = pre1; end2 = pre2;	/*产生新链表的首尾节点*/

	//对左右两个链表进行递归快排
	Quicksort(head1, end1);
	Quicksort(head2, end2);

	//从递归栈返回的时候,将key节点和左右两个链表连起来
	//左右链表都存在
	if( end1 && head2){
		end1->next = head;	head->next = head2;
		head = head1;	end = end2;}
	//只有左链表
	else if(end1) { 
		end1->next = head; 
		end = head;	head = head1; }
	//只有右链表
	else if(head2){ 
		head->next = head2;	end = end2;} 
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值