#include <iostream>
#include "iomanip"
#include "vector"
#include "algorithm"
#define m 10000
using namespace std;
/*
计数排序:
在每个元素取值范围的情况下(eg[0 - M]),开设cout[0] - cout[M]
用cout数组的每个元素代表的是a数组中元素数值为i的元素个数。由此对
a[]数组进行排序。
*/
void countSort(int a[] , int n)
{
int c[m+1];
for(int i = 0 ; i <= m ; i++) c[i] = 0;
for(int i = 0 ; i < n ; i++) c[a[i]]++;
//用数组c存放值为a[i]的元素个数
//c[i]代表元素值为i的个数,j代表a的排序位置
for(int i = 0 , j = 0 ; i < m+1 ; i++)
{
while(c[i]!=0)
{
a[j++] = i; c[i]--;
}
}
}
/*
桶排序:
在基于上述计数排序的情况下,缩小桶的个数
(因为数据在某些情况下离散程度比较高。eg,100笔 m是数值10000有2笔
而最小的是99999有98笔,那么就要开设10000个空间,造成浪费。)
由此,我们根据数据的情况进行划分每个桶的装填大小范围,减少桶的个数。
*/
void BucketSort(int arr[], int n)
{
int max = arr[0];
//找a表中元素的最大值
for (int i = 1; i < n; i++)
{
if (arr[i] > max)
max = arr[i];
}
//按照元素的最大值进行分配桶的个数
vector<int> *bucket = new vector<int>[max / 10 + 1];
//把所有元素装进对应的桶
for (int i = 0; i < n; i++)
{
int change = arr[i] / 10; //元素arr[i]所在的桶编号
bucket[change].push_back(arr[i]);
}
//对桶的元素排序
for (int i = 0; i < max / 10 + 1; i++)
{
if (bucket[i].size() > 0)
{
sort(bucket[i].begin(), bucket[i].end()); //桶内排序
}
}
int index = 0;
for (int i = 0; i < max / 10 + 1; i++) //桶遍历
{
for (int j = 0; j < bucket[i].size(); j++) //遍历桶内元素
{
arr[index++] = bucket[i][j];
}
}
}
int main()
{
int a[10] = {1,9,2,0,12,4,5,3,7,10};
BucketSort(a , 10);
for(int i = 0 ; i < 10 ; i++)
printf("%d ",a[i]);
}