您的位置:首页 > 编程语言

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

2015-03-19 00:01 711 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐