#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]); }