//自创的桶排序算法
#include<stdio.h>
#include<iostream>
#define Length 10
using namespace std;
void BucketSort(int num[], int range, int len);//待排数组 range:待排元素的低位可能的取值范围 待排数组的长度
void Insertion(int num[], int len);//对每个桶中的小数列进行插入排序
void Output(int num[], int len);
int main()
{
int num[Length] = {12, 2, 34, 56, 26, 8, 31, 6, 20, 3};
BucketSort(num, 10, Length);
Output(num, Length);
}
void BucketSort(int num[], int range, int len)
{
int numb[10][range];//创建辅助数组 10代表待排数组的最高位取值可能有10种 比如0到9
//range代表待排元素的低位可能的取值范围
//第一维的10个位置相当于10个小桶 第二维的位置相当于将待排元素放置进入每个小桶中
int j = 0;
int count[10];//辅助数组 用于记录每个小桶中的元素数
for(int i = 0; i < 10; i++)
count[i] = 0;//需要对两个辅助数组均进行初始化 因为都要利用累加计数操作
for(int i = 0; i < 10; i++)
{
for(int j = 0; j <range; j++)
numb[i][j] = 0;
}
for(int i = 0; i < len; i++)
{
numb[num[i] / 10][count[num[i] / 10]] = num[i];//此处默认待排数组元素只有两位 num[i]/10代表的就是待排元素的高位数字
//以此来判断应该将元素放入哪一个桶中
count[num[i] / 10]++;//将该桶中的元素个数记录加1
}
for(int i = 0; i < len; i++)
{
Insertion(numb[i], count[i]);//利用for循环 将每个小桶分别进行插入操作
}
int k = 0;
for(int i = 0; i < 10; i++)
{
for(int j = 0; j < 10; j++)
{
if(numb[i][j] != 0)//将排序好的小桶依次拷贝回原数组
num[k++] = numb[i][j];
}
}
}
void Insertion(int num[], int len)
{
int t;
if(len == 1)
return;
for(int i = 1; i < len; i++)
{
while(i > 0 && num[i] < num[i - 1])
{
t = num[i];
num[i] = num[i - 1];
num[i - 1] = t;
i--;
}
}
}
void Output(int num[], int len)
{
for(int i = 0; i < len; i++)
{
printf("%d ", num[i]);
}
cout << endl;
}