基数排序是借助“分配”和“收集”两种操作,对单逻辑关键字进行排序的一种内部排序方法。时间复杂度为O(d(n+rd))。d指d个关键字,r是指关键字基数,n是指有n个需要排序的结点。 //基数排序 #include <iostream> using namespace std; #define RADIX 10 //关键字基数,此时是十进制整数的基数 typedef struct { int keys[3]; int next; }SLCell; typedef struct { SLCell r[11]; int keynum; //记录的当前关键字个数 int recnum; //静态链表当前长度 }SLList; typedef int ArrType[RADIX]; void Distribute(SLCell r[], int i, ArrType &f, ArrType &e) { //静态链表L的r域中记录已按(keys[0]...keys[i-1])有序 //本算法按第i个关键字keys[i]建立RADIX个子表,使同一子表中keys[i]相同 //f[0..RADIX-1]和e[0..RADIX-1]分别指向各子表中第一个和最后一个记录 int j,p; for(j=0; j<RADIX; ++j) //各子表初始化为空表 f[j]=0; for(p=r[0].next; p; p=r[p].next) { j=r[p].keys[i]; if(!f[j]) f[j] = p; else r[e[j]].next = p; e[j] = p; } }//Distribute void Collect(SLCell r[], int i, ArrType f, ArrType e) { //本算法将按keys[i]自小到大地将f[0..RADIX-1]所指各子表依次链接成一个链表 //e[0..RADIX-1]为各子表的尾指针 int t,j; for(j=0; !f[j]; ++j); //找到第一个非空子表 r[0].next = f[j]; //r[0].next指向第一个非空子表中的第一个结点 t=e[j]; while(j<RADIX-1) { for(++j; j<RADIX-1 && !f[j]; ++j); //找到下一个非空子表 if(f[j]) { r[t].next = f[j]; t = e[j]; } } r[t].next=0; //t所指向的最后一个非空子表中的最后一个结点指向0,表示结束 }//Collect void RadixSort(SLList &L) { //L是采用静态链表表示的顺序表 //对L作基数排序,使得L称为按关键字从小到大的有序静态链表,L.r[0]为头结点 int i; ArrType f,e; for(i=0; i<=L.recnum; ++i) L.r[i].next = i+1; L.r[L.recnum].next = 0; //将L改造为静态链表 for(i=0; i<L.keynum; ++i) { Distribute(L.r, i, f, e); Collect(L.r, i, f, e); } }//RadixSort int main() { int i; SLList sl; sl.keynum = 3; sl.recnum = 10; int data[10] = {278, 109, 63, 930, 589, 184, 505, 269, 8, 83}; for(i=0; i<10; i++) { sl.r[i+1].keys[0] = data[i]%10; sl.r[i+1].keys[1] = data[i]/10%10; sl.r[i+1].keys[2] = data[i]/100; } RadixSort(sl); for(i=sl.r[0].next; i; i=sl.r[i].next) cout<<sl.r[i].keys[2]<<sl.r[i].keys[1]<<sl.r[i].keys[0]<<" "; cout<<endl; return 0; }