【Data_Structure笔记7】排序算法之【链式基数排序】

/******************************************************************************************************************
文件说明:
        采用单链表实现的【链式基数排序】
*******************************************************************************************************************/
#include<iostream>
using namespace std;


/*******************************************************************************************************************
模块说明:
        定义单链表的【结点】数据结构
********************************************************************************************************************/
typedef  struct LNode
{
	int    data;
	struct LNode *next;
}LNode,*LinkList;
/*******************************************************************************************************************
模块说明:
        初始化单链表,将单链表初始化为一个空表
********************************************************************************************************************/
void InitList(LinkList& pHead)
{
	pHead = (LinkList)std::malloc(sizeof(LNode));                        //【1】创建头结点
	pHead->next = NULL;                                                   //【2】将单链表初始化为空表
}
/*******************************************************************************************************************
模块说明:
        单链表的插入操作
********************************************************************************************************************/
void ListInsert(LinkList& pHead,int x)
{
	if(pHead==NULL)
	{
		std::cout<<"【NOTICE】此单链表尚没有初始化,请先初始化单链表!"<<std::endl;
		std::system("pause");
		std::exit(1);
	}
	else
	{
		LNode* pTail       = NULL;
		LNode* pInsertData = NULL;

		pTail = pHead;                    //【1】pTail始终指向表尾的结点
		pInsertData = (LNode*)std::malloc(sizeof(LNode));
		pInsertData->data = x;
		pInsertData->next = NULL;

		while (pTail->next!=NULL)
		{
			pTail = pTail->next;
		}
		pTail->next = pInsertData;
	}
}
/*******************************************************************************************************************
模块说明:
        获得单链表中的第一个结点
********************************************************************************************************************/
LNode* GetFirstLNode(LinkList pHead)
{
	if(pHead->next==NULL)
	{
		std::cout<<"【NOTICE】单链表为空表,获取第一个结点失败!"<<std::endl;
		std::system("pause");
		std::exit(0);
	}
	else
	{
		LNode* pTemp = NULL;
		pTemp = pHead->next;
		pHead->next = pTemp->next;
		return pTemp;
	}
}
/*******************************************************************************************************************
模块说明:
        在单链表中追加一个结点
********************************************************************************************************************/
void AppendLNode(LinkList& pHead,LNode* insertLNode)
{
	if(pHead==NULL)
	{
		std::cout<<"【NOTICE】此单链表尚没有初始化,请先初始化单链表!"<<std::endl;
		std::system("pause");
		std::exit(1);
	}
	else
	{
		LNode*  pTemp = NULL;
		pTemp = pHead;
		while(pTemp->next!=NULL)
		{
			pTemp = pTemp->next;
		}
		pTemp->next = insertLNode;
		insertLNode->next = NULL;
	}
}
/*******************************************************************************************************************
模块说明:
        将所有的子链表链接成一个大的链表
********************************************************************************************************************/
void Total(LinkList& pHead,LinkList pSubHead)
{
	LNode* pTemp = NULL;
	pTemp        = pHead;
	while (pTemp->next!=NULL)
	{
		pTemp = pTemp->next;
	}
	pTemp->next = pSubHead->next;
}
/*******************************************************************************************************************
模块说明:
********************************************************************************************************************/
int Power(int a,int n)
{
	int y;
	if(n==0)
		return 1;
	else
	{
		y=Power(a,n/2);
		y=y*y;
		if(n%2==1)
			y=y*a;
	}
	return y;
}
/*******************************************************************************************************************
模块说明:
********************************************************************************************************************/
int GetNum(LNode *p,int i)
{
	int data=p->data;
	int a;
	i--;
	a=data/Power(10,i);
	return a%10;
}
/*******************************************************************************************************************
模块说明:
        链式基数排序的核心模块
参数说明:
        [1]LinkList pHead
		[2]int      iCount--------表示参加排序的整数的最大位数一共有iCount位数字
********************************************************************************************************************/
void RadixSort(LinkList& pHead,int iCount)
{
	LinkList   pSubHead[10];                                       //【1】定义10个子链表的头结点
	LNode*     qTempLNode = NULL;
	int        k         = 0;
	int        j         = 0;
	int        i         = 0;

	for(j=1;j<=iCount;j++)
	{
		for(i=0;i<10;i++)
		{
			InitList(pSubHead[i]);
		}//for i
		while (pHead->next!=NULL)                                  //【2】链表从头到尾扫描,并将扫描到的结点脱离链表
		{
			qTempLNode = GetFirstLNode(pHead);                      //【3】获得链表上的一个结点
			k          = GetNum(qTempLNode,j);                      //【4】取得链表结点第j位的元素值k
			AppendLNode(pSubHead[k],qTempLNode);                    //【5】将该结点链接到10个子链表相应的位置
		}
		for(i=0;i<10;i++)                                           //【6】将10个子链表从0~9依次连接到pHead结点的后面
		{
			Total(pHead,pSubHead[i]);
		}
	}//for j
	for(i=0;i<10;i++)
	{
		delete(pSubHead[i]);
	}
}

/*******************************************************************************************************************
模块说明:
        遍历单链表,输出单链表中结点的数据
********************************************************************************************************************/
void PrintLinkList(LinkList pHead)
{
	LNode*   pTemp = NULL;
	pTemp = pHead->next;
	while(pTemp!=NULL)
	{
		std::cout<<pTemp->data<<std::endl;
		pTemp = pTemp->next;
	}
}
void main()
{
	LinkList pHead = NULL;
	InitList(pHead);

	ListInsert(pHead,100);
	ListInsert(pHead,10);
	ListInsert(pHead,90);
	ListInsert(pHead,80);
	ListInsert(pHead,70);
	ListInsert(pHead,60);
	ListInsert(pHead,50);
	ListInsert(pHead,40);
	ListInsert(pHead,30);
	ListInsert(pHead,20);
	
	RadixSort(pHead,4); //表示参加排序的整数最大位数一共有4位数字
	PrintLinkList(pHead);

	system("pause");
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值