您的位置:首页 > 其它

基数排序

2012-09-06 15:25 295 查看
祈祷找个好工作……

基数排序,按照从低位到高位,往桶子里塞(LSD)

参考资料:http://baike.baidu.com/view/1170573.htm

#include "stdio.h"
#include "string.h"
#include "stdlib.h"

typedef struct _Node{
int num;
int pos;
struct _Node* next;
}Node, *pNode;

pNode table[10];
pNode end[10];

int num[] = {34, 112, 4, 55, 81, 33, 3233, 40, 3, 66, 0, 22323454};
int n = 12;

pNode sort(){
int i, p, mk;
pNode t, r, e, ans, tail;

memset(table, 0, sizeof(table));
memset(end, 0, sizeof(end));

r = e = 0;
for(i=0; i<n; i++){
t = (pNode)malloc(sizeof(Node));
t->num = num[i];
t->pos = i;
if(r==e && !e)
r = e = t;
else{
e->next = t;
e = t;
}
}
e->next = 0;

ans = tail = 0;

while(1){

while(r){
if(!r->num){
if(ans==tail && !tail)
ans = tail = r;
else{
tail->next = r;
tail = r;
}
r = r->next;
continue;
}
p = r->num%10;
r->num /= 10;
if(table[p]==end[p] && !end[p])
table[p] = end[p] = r;
else{
end[p]->next = r;
end[p] = r;
}
r = r->next;
}

r = e = 0;
mk = 1;
for(i=1; i<n; i++){
if(table[i]){
if(r==e && !e){
r = table[i];
e = end[i];
}
else{
e->next = table[i];
e = end[i];
}
mk = 0;
}
table[i] = end[i] = 0;
}

if(mk) break;
e->next = 0;
}
tail->next = 0;
return ans;
}

int main(){
pNode r = sort();
while(r){
printf("%d ", num[r->pos]);
r = r->next;
}
printf("\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: