桶排序和基数排序(熟练掌握代码中结构体的使用trick)

本文介绍了两种排序算法——桶排序和基数排序的具体实现过程。桶排序通过将数据分布到多个桶中,再对各桶内数据进行快速排序来完成整体排序;基数排序则根据数字的每一位将待排序数组分配到不同的桶中,最后按位收集数据完成排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.桶排序

extern void quick_sort(int a[], int p, int q);

/*桶的数目等于元素的数目,data数组的所有元素值均在[0,1)之间,所以进入桶的编号可由k = data[i] * n;来确定*/


struct barrel {     //每个桶的结构(每个桶最多10个元素)
    int node[10];   
    int count;
};   
  
void bucket_sort(int data[], int size)   
{   
    int max, min, num, pos;   
    int i, j, k;   
    struct barrel *pBarrel;   
   
    num = n ;     //桶的个数
    
    /*清空所有的桶*/
    pBarrel = (struct barrel*)malloc(sizeof(struct barrel) * num);   
    memset(pBarrel, 0, sizeof(struct barrel) * num);   
  
    /* put data[i] into barrel which it belong to */  
    for (i = 0; i < size; i++) {   
        k = data[i] * n;        /* calculate the index of data[i] in barrel */  
        (pBarrel + k)->node[(pBarrel + k)->count] = data[i];   
        (pBarrel + k)->count++;   
    }   
       
    pos = 0;   
    for (i = 0; i < num; i++) {   
        quick_sort((pBarrel+i)->node, 0, (pBarrel+i)->count-1);/* sort node in every barrel */  
  
        for (j = 0; j < (pBarrel+i)->count; j++) {   
            data[pos++] = (pBarrel+i)->node[j];   //所有数已经入桶,所以不怕覆盖
        }   
    }   
    free(pBarrel);   
}   
  
main()   
{   
    int data[] = {78, 17, 39, 26, 72, 94, 21, 12, 23, 91}, i;    
    bucket_sort(data, int size = sizeof(data) / sizeof(int));   
  
    for (i = 0; i < size; i++)   
        printf("%d ", data[i]);   
}  


2.基数排序


#define RADIX_10 10
#define KEY_NUM 10

struct radix{
        int count;  //用于存储每个位子(0~9)上分配到的数字的个数 
        int *node;	
};   //这样的结构体总共有10个(每个数字每一位只可能是0~9中的一个) 

int GetNumInPos(int x, int pos){
	int tmp=1;
	for(int i=0;i<pos;i++)
	    tmp*=10;
	return (x/tmp)%10;
}

void  RadixSort(int *data ,int size)
{
	int pos;     
//	int m=0;
	
    struct radix *pRadix=(struct radix*)malloc(sizeof(struct radix)*RADIX_10);
	memset(pRadix,0,sizeof(struct radix)*RADIX_10);
	
	for(int i=1;i<=KEY_NUM;i++){
	    for(int j=0;j<size;j++){
	        pos=GetNumInPos(data[j],i);
	        (pRadix+pos)->node[(pRadix+pos)->count]=data[j];
         	(pRadix+pos)->count++;
    	} 
	    
		for(int i=0,m=0;i<RADIX_10;i++){ 
		    for(int k=0;k<(pRadix+i)->count;k++){ 
			    data[m++]=(pRadix+i)->node[k]; 
			}
       	(pRadix+i)->count=0; //一定不要忘了清0 
		}
	} 
	free(pRadix); 
}


参考资料:http://blog.csdn.net/cjf_iceking/article/details/7943609

                    http://blog.csdn.net/houapple/article/details/6480100

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值