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

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

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

 

    原文作者:葫芦赛赛
    原文地址: https://blog.csdn.net/huruzun/article/details/25001085
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞