单链表快速排序算法实现

单链表快速排序算法实现

算法思想对于一个链表,以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;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值