2026/4/18 14:23:34
网站建设
项目流程
重庆可做网站 APP,网站微信建设运维经验分享图,建网站多少钱 万户,建设摩托车官方网1、记数排序
概念#xff1a;
简述#xff1a;将整个数组中的各个数据的个数数出来#xff0c;然后讲这些数据重新填入原数组中
将要排序的数组先遍历一遍#xff0c;选出最大的和最小的#xff0c;以max-min1(左闭右闭区间)为范围range
int min arr[0], max arr[0];//这…1、记数排序概念简述将整个数组中的各个数据的个数数出来然后讲这些数据重新填入原数组中将要排序的数组先遍历一遍选出最大的和最小的以max-min1(左闭右闭区间)为范围rangeintminarr[0],maxarr[0];//这里很巧妙以arr[0]作为min和max可以解决排序负数的问题for(inti0;in;i){if(arr[i]max)maxarr[i];if(arr[i]min)minarr[i];}以range为数组大小开一个数组count将数组中的数据全都初始化为0,这里存在一个问题我们难道要将0到max的值全部开出来吗答不是我们采用“相对值”的方法即将数据储存在相对于最小值的位置intrangemax-min1;int*count(int*)calloc(range,sizeof(int));//nullptr判断if(nullptrcount){perror(calloc fail);}我们再将原数组中的数据中的每个数据的个数统计出来for(inti0;in;i){count[arr[i]-min];}然后将count中的数依次填入原数组intj0;for(inti0;irange;i){while(count[i]--0){arr[j]imin;}}实现voidCountSort(int*arr,intn){intminarr[0],maxarr[0];//这里很巧妙以arr[0]作为min和max可以解决排序负数的问题for(inti0;in;i){if(arr[i]max)maxarr[i];if(arr[i]min)minarr[i];}intrangemax-min1;int*count(int*)calloc(range,sizeof(int));if(nullptrcount){perror(calloc fail);return;}for(inti0;in;i){count[arr[i]-min];}intj0;for(inti0;irange;i){while(count[i]--0){arr[j]imin;}}}分析时间复杂度O(Nrange)空间复杂度O(range)这使得记数排序适合排序数的大小范围较集中的数据当然数据量足够大的时候这个方面的影响会减弱2、基数排序太废了不做进一步了解3、桶排序太废了不做进一步了解在这里插入图片描述