基数排序

祈祷找个好工作……

基数排序,按照从低位到高位,往桶子里塞(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;
 }
 
 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值