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

来源:互联网 发布:神界原罪2低配优化 编辑:程序博客网 时间:2024/06/06 22:45
/******************************************************************************************************************文件说明:        采用单链表实现的【链式基数排序】*******************************************************************************************************************/#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 iwhile (pHead->next!=NULL)                                  //【2】链表从头到尾扫描,并将扫描到的结点脱离链表{qTempLNode = GetFirstLNode(pHead);                      //【3】获得链表上的一个结点k          = GetNum(qTempLNode,j);                      //【4】取得链表结点第j位的元素值kAppendLNode(pSubHead[k],qTempLNode);                    //【5】将该结点链接到10个子链表相应的位置}for(i=0;i<10;i++)                                           //【6】将10个子链表从0~9依次连接到pHead结点的后面{Total(pHead,pSubHead[i]);}}//for jfor(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");}

原创粉丝点击