今儿我们来聊一聊 桶排序, 顾名思义就是把元素放到桶里面排序,桶排序是一个不需要比较的排序算法,所以对排序的元素是有限定的。
桶排序的原理:元素必须是正整数! 定义0-9的10个数组(桶),将所有元素依次从个位数开始放到每个对应的数组(桶)中,按照先进先出的方式重新整合,再依次从十位的数字放到对应的桶中,位数不够的元素补零,依次遍历到最大数的位数。
看动态图来理解一下吧
先按照每个元素的个位数 进行桶分配
然后再降元素重新整合
重新整合后的集合,个位数是从小到大排序的 。依次操作到最大位数,即可完成排序操作!!
废话不说了 ,上码吧 !
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#define Max_len 14 //数组元素个数
// 打印结果
void Show(int arr[], int n)
{
int i;
for ( i=0; i<n; i++ )
printf("%d ", arr[i]);
printf("\n");
}
//获得未排序数组中最大的一个元素值
int GetMaxVal(int* arr, int len)
{
int maxVal = arr[0]; //假设最大为arr[0]
for(int i = 1; i < len; i++) //遍历比较,找到大的就赋值给maxVal
{
if(arr[i] > maxVal)
maxVal = arr[i];
}
return maxVal; //返回最大值
}
//桶排序 参数:数组及其长度
void BucketSort(int* arr , int len)
{
int tmpArrLen = GetMaxVal(arr , len) + 1;
int tmpArr[tmpArrLen]; //获得空桶大小
int i, j;
for( i = 0; i < tmpArrLen; i++) //空桶初始化
tmpArr[i] = 0;
for(i = 0; i < len; i++) //寻访序列,并且把项目一个一个放到对应的桶子去。
tmpArr[ arr[i] ]++;
for(i = 0, j = 0; i < tmpArrLen; i ++)
{
while( tmpArr[ i ] != 0) //对每个不是空的桶子进行排序。
{
arr[j ] = i; //从不是空的桶子里把项目再放回原来的序列中。
j++;
tmpArr[i]--;
}
}
}
int main()
{ //测试数据
int arr_test[Max_len] = {8, 21, 563, 63, 456, 5, 70, 2, 4, 76, 54, 2, 1, 3};
//排序前数组序列
Show( arr_test, Max_len );
//排序
BucketSort( arr_test, Max_len);
//排序后数组序列
Show( arr_test, Max_len );
system("pause");
return 0;
}
运行结果: