桶排序
桶排序 (Bucket sort)或所谓的箱排序的原理是将数组分到有限数量的桶子里,然后对每个桶子再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序),最后将各个桶中的数据有序的合并起来。
排序过程:
假设待排序的一组数统一的分布在一个范围中,并将这一范围划分成几个子范围,也就是桶
将待排序的一组数,分档规入这些子桶,并将桶中的数据进行排序
将各个桶中的数据有序的合并起来
#include<stdio.h>
#include<stdlib.h>
#define SIZE 100
void bucket_sort(unsigned *, int);//桶排序函数的原型
void print(unsigned *, int);//打印函数的原型
int main8()
{
unsigned array[SIZE];
int i = 0;
//为数组元素随机赋值
for (i = 0; i < SIZE; ++i)
array[i] = rand();
printf("排序前\n");
print(array, SIZE);
//排序
bucket_sort(array, SIZE);
printf("排序后\n");
print(array, SIZE);
system("pause");
return 0;
}
void bucket_sort(unsigned * arr, int len)
{
unsigned *buckets[10];//指针数组
unsigned n = 1;//用于取整数各位上的值
int index;//数组下标计数索引
int indexs[10];//各个桶下标计数索引
int i, j;
//分配动态内存作为桶
for (i = 0; i < 10; ++i)
buckets[i] = (unsigned *)malloc(sizeof(unsigned)*len);
while (1)
{
//计数索引清零
index = 0;
for (i = 0; i < 10; ++i)
indexs[i] = 0;
//数组至桶
for (i = 0; i < len; ++i)
buckets[arr[i] / n % 10][indexs[arr[i] / n % 10]++] = arr[i];
//桶至数组
for (i = 0; i < 10; ++i)
for (j = 0; j < indexs[i]; ++j)
arr[index++] = buckets[i][j];
//为取元素的下一位做准备
n *= 10;
//判断是否该结束
for (i = 0; arr[i] < n&&i < len; ++i);
if (i == len) break;
}
//释放动态内存
for (i = 0; i < 10; ++i)
free(buckets[i]);
}
void print(unsigned * arr, int len)
{
int i = 0;
for (i = 0; i < len; ++i)
{
printf("%8d", arr[i]);
//5个元素一行
if ((i + 1) % 5 == 0)
printf("\n");
}
}