基数排序 - 次位优先算法
算法描述
多关键字排序:
又比如123,主位是1,次卫是3。
123,46,791。 按照次位优先 次位:791,123,46
次次位:123,46,791
次次次位:46,123,791
具体实现
建立桶元素结点,用链表实现。
建立桶头尾结点结构体。
构造GetDigit ( int X, int D )函数 用来得到X的D位的数字
构造LSDRadixSort( ElementType A[], int N )
{
初始化每个桶为空链表
将原始序列逆序存入初始链表List
排序
{
对数据的每一位循环处理
{
获得当前元素的当前位数字
从List中摘除
插入B[Di]号桶尾
}
}
收集(将每个桶的元素顺序收集入 将List倒入A[]并释放
1 #define MaxDigit 4 2 #define Radix 10 3 typedef struct Node *PtrToNode; 4 struct Node 5 { 6 int key; 7 PtrToNode Next; 8 }; 9 //定义桶头节点 10 struct HeadNode 11 { 12 PtrToNode head; 13 PtrToNode tail; 14 }; 15 typedef struct HeadNode Bucket[Radix]; 16 /* 17 X是所求的数,X是几位数 D就是几 18 */ 19 int GetDigital(int X,int D) 20 { 21 int i,d; //d为返回值,是X在某位上的具体数 22 for(i=1;i<=D;i++) 23 { 24 d=X%Radix; //Radix =10; 25 X/=Radix; //Radix =10; 26 } 27 return d; 28 } 29 void LSDRadixSort(ElementType A[],int N) 30 { 31 Bucket B; 32 int i ,D,Di; 33 PtrToNode P,temp,list=NULL; 34 35 /*初始化桶*/ 36 for(i=0;i<Radix;i++) 37 38 B[i].head=B[i].tail=NULL; 39 40 /*将数组逆序导入链表list*/ 41 for(i=0;i<N;i++) 42 { 43 temp=(PtrToNode)malloc(sizeof( struct Node)); //新建temp 44 temp->key=A[i]; 45 temp->Next=list; // 第一次temp为list list为null 46 list=temp; //更新list 为temp 47 } 48 49 /*从最低位开始入桶*/ 50 51 for(D=1;D<=MaxDigit;D++) 52 { 53 P=list; 54 while(P) 55 { 56 Di=GetDigital(P->key,D); 57 /*获取位数*/ 58 temp=P; 59 P=P->Next; 60 temp->Next=NULL; 61 /*从list中摘除*/ 62 if(B[Di].head==NULL) 63 B[Di].head=B[Di].tail=temp; 64 else 65 { 66 B[Di].tail->Next=temp; 67 B[Di].tail=temp; 68 } 69 } 70 71 /*收集*/ 72 list=NULL; 73 for(Di=Radix-1;Di>=0;Di--) 74 { 75 if(B[Di].head) 76 { 77 B[Di].tail->Next=list; 78 list=B[Di].head; 79 B[Di].head=B[Di].tail=NULL;//清空桶 80 } 81 } 82 } 83 /* 将list倒入A[]并释放空间 */ 84 for(i=0;i<N;i++) 85 { 86 temp=list; 87 list=list->Next; 88 A[i]=temp->key; 89 // printf(" i: %d a: %d ",i,A[i]); 90 free(temp); 91 } 92 }
错误分析:1.将82行的{ 放在了70行。