您的位置:首页 > 其它

基数排序 - 主位优先

2016-09-13 20:05 267 查看
算法思想:

主位优先 排序好后直接导出

2,130,22,10,1230,4565,64,340,2430,1340

D=4。

桶0:2,130,22,10,64,340, || 桶1:1230,1340 || 桶4:4565

D=3    

桶0:2,22,10,64 桶1:130 桶3:340     || 桶2:1230 桶3 1340 || 桶5:4565

D=2

桶0:2 桶1:10 桶2:22 桶6:64 || 桶3:130 || 桶4:340 || 桶3:1230 || 桶4:1240 || 桶6: 4565

D=1

桶2:2 || 桶0:10 ||桶2:22 ||桶4:64 ............................................................................

void MSD( ElementType A[], int L, int R, int D )
{
Bucket B;
int i,j ,Di;
PtrToNode P,temp,list=NULL;

if(D==0) return;
/*初始化桶*/
for(i=0;i<Radix;i++)

B[i].head=B[i].tail=NULL;

/*将数组逆序导入链表list*/
for(i=L;i<=R;i++)
{
temp=(PtrToNode)malloc(sizeof( struct Node));  //新建temp
temp->key=A[i];
temp->Next=list;    // 第一次temp为list list为null
list=temp;          //更新list 为temp
}

/*分配*/
P=list;
while(P)
{
Di=GetDigital(P->key,D);
temp=P;
P=P->Next;
if (B[Di].head == NULL) B[Di].tail = temp;
temp->Next = B[Di].head;
B[Di].head = temp;

}
/*收集*/

i=j=L;
for(Di=0;Di<Radix;Di++)
{
if(B[Di].head)
{
P=B[Di].head;
while(P)
{
temp=P;
P=P->Next;
A[j++]=temp->key;
free(temp);
}
MSD(A,i,j-1,D-1);
i=j;
}
}
}
void MSDRadixSort( ElementType A[], int N )
{ /* 统一接口 */
MSD(A, 0, N-1, MaxDigit);
}


错误分析:

1 42行 注意不要将list赋给p

2 30行不好理解

...............................................
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: