排序算法(七)基数排序

来源:互联网 发布:51单片机p0口上拉电阻 编辑:程序博客网 时间:2024/06/05 10:31

从低位到高位排序,用hash来实现

#include <iostream>#define  N 400using namespace std;typedef struct Hdata{int data;struct Hdata *next;}Node;void radixSort(int *pData,unsigned int nLen);bool GetMax(int *pData,unsigned int nLen,int &nMax);int GetDigit(int nNum);void deleteLinklist(Node *&pHead);void addLinkList(Node *&pHead,int nData);void printLinklist(Node *pHead);unsigned int abstractIndex(unsigned int nData,unsigned int nIndex);int data[N];int main(){for( int i=0;i<N;i++)data[i]=N-i;for( int i=0;i<N;i++)cout<<data[i]<<'\t';cout<<endl;radixSort(data,N);for( int i=0;i<N;i++)cout<<data[i]<<'\t';cout<<endl;getchar();}void radixSort(int *pData,unsigned int nLen){if (pData==NULL||nLen==0){return;}int nMax;GetMax(pData,nLen,nMax);int nTime=GetDigit(nMax);Node *p[10];for (int i=0;i<10;i++){p[i]=NULL;}for (int i=1;i<=nTime;i++){//把对应的位数提出来 放到桶里面for (unsigned int j=0;j<nLen;j++){unsigned int nIndex=abstractIndex(pData[j],i);   //把第i位提出来addLinkList(p[nIndex],pData[j]);}// 重新排列出来放到原来的pData中unsigned int nIndexTemp=0;for (int j=0;j<10;j++){Node *pTemp=p[j];while(pTemp!=NULL){pData[nIndexTemp]=pTemp->data;pTemp=pTemp->next;nIndexTemp++;}}//for (int j=0;j<10;j++){deleteLinklist(p[j]);}}}bool GetMax(int *pData,unsigned int nLen,int &nMax){if (pData==NULL||nLen==0){nMax=0;return false;} nMax=pData[0];for (unsigned int i=0;i<nLen;i++){if (pData[i]>nMax){nMax=pData[i];}}return true;}int GetDigit(int nNum){int nTemp=nNum;int nDigit=0;while(nTemp!=0){nTemp/=10;nDigit++;}return nDigit;}void deleteLinklist(Node *&pHead){if (pHead==NULL){return;}Node *pPre=pHead;Node *pAfter=pHead->next;while (pAfter!=NULL){delete pPre;pPre=pAfter;pAfter=pAfter->next;}delete pPre;pPre=NULL;pHead=NULL;}void addLinkList(Node *&pHead,int nData){Node *pTemp=pHead;if (pTemp==NULL){pHead=new Node;pHead->data=nData;pHead->next=NULL;return;}while(pTemp->next!=NULL)pTemp=pTemp->next;pTemp->next=new Node;pTemp=pTemp->next;pTemp->data=nData;pTemp->next=NULL;}unsigned int abstractIndex(unsigned int nData,unsigned int nIndex){unsigned int nTemp=nData;unsigned int nResult;for (unsigned int i=0;i<nIndex;i++){nResult=nTemp%10;nTemp/=10;}return nResult;}void printLinklist(Node *pHead){if (pHead==NULL){return;}Node *pTemp=pHead;while(pTemp!=NULL){cout<<pTemp->data<<'\t';pTemp=pTemp->next;}cout<<endl;}


 

0 0
原创粉丝点击