排序算法的数组实现 -- 桶排序(五)

//桶排序,假设对范围为0-99之间的int型数值进行排序,分成10个相同区间的桶

//这里用到了链表的排序算法,可以从单链表的排序(一)找到相应算法

void Insert_sort_Swap_Node(EleLink *old_froMax_Node, EleLink *old_Max_Node,EleLink *froMax_Node, EleLink *Max_Node)
{
	EleLink *tmp = Max_Node->pnext;

	if(old_Max_Node->pnext == Max_Node)
	{
		old_froMax_Node->pnext = Max_Node;
		Max_Node->pnext = old_Max_Node;
		old_Max_Node->pnext = tmp;
	}
	else
	{
		old_froMax_Node->pnext = Max_Node;
		Max_Node->pnext = old_Max_Node->pnext;

		froMax_Node->pnext = old_Max_Node;
		old_Max_Node->pnext = tmp;
	}
}

void Link_Insert_Sort(EleLink *pNode)
{
	if(!pNode || !pNode->pnext)
		return;

	EleLink *p = pNode->pnext;
	int ncount = 0;
	while (p)
	{
		ncount++;
		p = p->pnext;
	}

	p = pNode;
	EleLink *fro_Node, *froMax_Node;
	EleLink *cur_Node, *Max_Node;
	for (int i = 0; i < ncount - 1; i++)
	{
		froMax_Node = p;
		Max_Node = p->pnext;

		fro_Node = p->pnext;
		cur_Node = fro_Node->pnext;

		while(cur_Node)
		{
			if(Max_Node->Value > cur_Node->Value)
			{
				froMax_Node = fro_Node;
				Max_Node = cur_Node;
			}

			fro_Node = cur_Node;
			cur_Node = cur_Node->pnext;
		}

		if(Max_Node != p->pnext)
			Insert_sort_Swap_Node(p, p->pnext,froMax_Node, Max_Node);

		p = p->pnext;

	}
}

void Bucket_Sort(int *a, int size, EleLink** bucket, int ncnt)
{
	for(int i = 0; i < size; i++)
	{
		int temp = a[i] / 10;
		EleLink *p_Ele = new EleLink;
		p_Ele->pnext = NULL;
		p_Ele->Value = a[i];

		EleLink *ptr = bucket[temp];
		EleLink *p_tmp = ptr->pnext;
		ptr->pnext = p_Ele;
		p_Ele->pnext = p_tmp;
	}

	int m = 0;
	for (int j = 0; j < ncnt; j++)
	{
		Link_Insert_Sort(bucket[j]);

		EleLink *ptr = bucket[j]->pnext;

		while(ptr)
		{
			a[m++] = ptr->Value;
			ptr = ptr->pnext;
		}
	}
	
	assert(m == size);
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值