/////基数排序/////////////////////////////////////////////////////////////////////
void radix_paixu(ylist & l, int n){
	int i;//外层循环使用
	array f , e ;//桶子
	n = l.type ;

	int p;

	for ( i = 0 ; i < n ; i++)//分配到倒数第二个信息;
	{//1、为每一个结构体分配头指针
		l.data[i].next = i + 1 ;
	}
	//2、最后一个信息的尾指针为0,为以后做判断用;
	l.data[n].next = 0 ;//刚开始数组越界了

	for (i = 3 ; i  >= 0  ; i++ )//共四个字符,所以需要四次
	{
		distribute(l , i , f , e);//第i趟分配
		collect(l , i , f , e);//第i趟收集
	}
}//end

void distribute(ylist & l, int i , array &f , array &e){
//分配
	int j ;//内层循环使用
	int p ;//每个“桶”内的指针指向 
	for (j = 0; j < 26; j++)
	{//分配26个“桶”来分别保存数据
		f[j] = 0;// 每个“桶”初始化头指针为0;
		e[j] = 0;
	}	
	for (p = l.data[0].next ; p ; p = l.data[p].next)//按顺序填入“桶”中
	{
		if ( i > 0 )
		{//数字判断;
			j = l.data[p-1].num[i] - '0';//- '0'因为输入时是以字符形式输入的;	
			cout<<l.data[p-1].num[i]<<endl;
			if (!f[j])
			{//判断是否为第一个,是进入
				f[j] = p;
			}
			else
			{//后面接入
				l.data[e[j]].next = p ;	
			}
			e[j] = p ;//尾指针相应变化
		}//外if
		else
		{//是字母时进入此处
			j = l.data[p-1].num[i] - 'A';//- '0'因为输入时是以字符形式输入的;	
			
			if (!f[j])
			{//判断是否为第一个,是进入
				f[j] = p;
				//e[j] = p;
			}
			else
			{//后面接入
				l.data[e[j]].next = p ;
			}
			e[j] = p ;//尾指针相应变化
		}//外else
	}//else

}//end


void collect(ylist & l, int i , array f , array e){
//收集
	int j,p;//循环遍历是否有空表

	int t;//保存表的尾;

	for (j = 0 ; !f[j] ; j ++);	

	l.data[0].next = f[j];//遍历找第一个非空数据
	
	t = e[j];

	while (j < 25 )
	{
		for (j = j + 1 ; j < 25 && !f[j] ; j++) ;

		if (!f[j])
		{//头尾相连
			l.data[t].next = f[j];
			t = e[j] ;
		}
		l.data[t].next = 0;//循环一次尾置空一次
	}//while
			for (p = l.data[0].next ; p  ; p = l.data[p].next)//按顺序填入“桶”中
	{
	cout<<l.data[0].name <<endl;
	}

}//end

void num_paixu(ylist l){
//销售额
	radix_paixu(l , l.type);
}