C++链表的归并排序

void sort(node* plst,int low,iny high,int *parray)//low与high是闭区间[low,high]
{
	if(low<high)当数组至少有2个值时
	{
		int mid=(low+high)/2;//取出数组的中间值
		sort(plst,low,mid,parray);//递归调用左半边链表进行排序
		sort(plst,mid+1,high,parray);//递归调用右半边链表进行排序
		mergearray(plst,low,mid,mid+1,high,parray);//对左右链表进行合并排序
	}
}
 
void mergearray(node* p1,int l1,int h1,int l2,int h2,int *parray)//p1始终是头链表
{
	node *p2=p1;
	for(int z=0;z<l2;++z)//p2变为右边头链表
		p2=p2->next;
	for(int z=0;z<l1;++z)//p1为左边头链表
		p1=p1->next;
	node *head=p1;
	int i=l1 , j=l2 , count=0;
	for(;i<=h1&&j<=h2;)//对左右链表进行比较,谁小谁就进入存储数组,然后数组链表+1
	{
		if(p1->data<p2->data)
			parray[count++]=p1->data,p1=p1->next,++i;
		else if(p1->data>=p2->data)
			parray[count++]=p2->data,p2=p2->next,++j;
	}
	for(;i<=h1;++i)//把剩下的数据拷贝到存储数组中
		parray[count++]=p1->data,p1=p1->next;
	for(;j<=h2;++j)
		parray[count++]=p2->data,p2=p2->next;
	for(int z=0;z<count;++z)//将存储数组的数据重新拷贝到链表中
		head->data=parray[z],head=head->next;
 
}

现在,我们就讲解一下这两个函数,归并排序使用的是分而治之的思想,就是不断把一个问题划分为更小规模的子问题,比方说有5,4,3,2,1,5个数字,我们先把5,4,3分成一组,再把2,1分成一组,紧接着,我们把5,4,3分成5,4和3两组,然后对5,4进行排序,变成4,5和3,在对4,5,3进行排序,为3,4,5,在对2,1进行排序,变成1,2,最后对3,4,5,1,2进行合并排序,变成1,2,3,4,5,这样数组就是有序的了,从总体上看,我们先对左右两边数组进行排序,排好之后在进行合并,这就是合并排序了,注意在链表的合并排序中,要对链表进行前移,因为无法对链表进行数组式的索引。


猜你喜欢

转载自blog.csdn.net/anzijian1993/article/details/38227159
今日推荐