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