一计数排序 Countsort(升序为例)开辟一个额外数组count用于存储待排数组中的元素个数譬如待排数组为{2,2,3,3,5,5,5,6,3,1}这样1的个数有1个存在count数组的第一位中2有2个存在count数组的第二位中3有3个存在count数组的第三位中4有0个存在count数组的第四位中5有3个存在count数组的第五位中6有1个存在count数组的第六位中。即arr中的数据是啥就将它的个数存储到count对应下标的位置处。然后再根据count数组中存储的数据个数依次将值拷贝回原数组中1有1个放回原数组中占一个位置2有2个放回原数组中挨着1占两个位置3有3个放回原数组中挨着2占三个位置4放回原数组中挨着3占零个位置5有3个放回原数组中挨着4占三个位置6有一个放回原数组中挨着5占一个位置。排好序后原数组变成了{1,2,2,3,3,3,5,5,5,6}排升序完成。1代码实现void Countsort(int* arr,int n) { int* tmp (int*)calloc(n,sizeof(int)); if(tmp NULL) { return; } int* count tmp; //找最大最小值 int max arr[0]; int min arr[0]; for(int i1;in;i) { if(arr[i]max) max arr[i]; if(arr[i]min) min arr[i]; } int range max-min1; //定义数组的长度 for(int i 0;in;i) { //让count数组相应下标处存储处理后的arr数组的数据的出现次数 count[arr[i]-min]; } //让count数组中存储的个数显化为arr数组的排序 int j 0; for(int i 0;irange;i) { while(count[i]--) arr[j] imin; } }2细节理解数组里存的数据不同count数组的大小就不同所以我们采用动态申请内存的方式创建数组。要确定count数组的大小就要知道arr中的数据范围是多少因为count数组存储的是arr数组中各个数据的出现次数找到arr数组数据的取值范围就知道count数组需要记录多少个数据的出现次数这个多少个数据就是count数组的大小。所以我们找到arr数组中的max和min通过max-min1的方式来确定count数组的大小range。接下来遍历arr数组前面我们说arr中的数据是啥就将它的个数存储到count对应下标的位置处但这句话是有问题的假设数组arr为{103,102,109,105}我们能确定count数组的大小为109-10218那count数组的下标范围就为0-7何来103/102/109/105呢所以arr中数据要先处理一下再看这个处理后的数据处理后的数据是啥就将它的个数存储到count数组对应下标的位置。处理的方式就是将arr数组中的数据先减去min。arr为{103,102,109,105}处理后就变成了{1,0,7,3}这样count数组0-7的下标就能满足存储要求了由于0-7范围内arr只出现了1,0,7,3还有一些数没有出现但是count数组中已经为这些没有出现的数据创建了空间所以这些空间里填的值应当为0这也对应了为什么我们用calloc动态申请内存calloc申请空间并将空间全部初始化为0。等到将count数组中存储的数据个数显化成arr中的数据时遍历count数组内嵌循环赋值注意由于count数组存储的数据个数是处理后的数据的个数那么再赋值回arr数组时就需要将count的下标加上min。二基数排序 Radixsort基数排序Radix Sort是一种非比较型的排序算法它通过逐位比较元素的每一位从最低位到最高位来实现排序。基数排序的核心思想是将整数按位数切割成不同的数字然后按每个位数分别进行排序。基数排序算法适用于对多个整数或者多个字符串进行升序或降序排序。三桶排序 Bucketsort桶排序Bucket Sort是一种分布式排序算法它将待排序的元素分配到若干个桶Bucket中然后对每个桶中的元素进行排序最后将所有桶中的元素按顺序合并。桶排序的核心思想是将数据分到有限数量的桶中每个桶再分别排序可以使用其他排序算法或递归地使用桶排序。后两者出现频率不高此处不过多解释了。——end——