思路:这是一种基于非常的算法,我们用一庚组来存放那些数据,这些数据在这庚组中的表现形式是以这庚组的下标存在的,比如57,60,42这三钢进行排星么用一庚组,这庚组的arr[57] = 1,arr[60] = 1,arr[42] = 1,然胡这庚组就行了。
时间复杂度:O(n+k),其中这甘莸姆段В约剖判屎鲜荼冉霞械氖榕判榷ㄐ裕何榷ǖ乃惴?/p>
代码实现:

void count_sort(int arr[],size_t len){
int max = arr[0]; //最
int min = arr[0]; //最小值
size_t i;
for(i=0;i<len;i++){
if(max<arr[i]){ //找到最
max =arr[i];
}
if(min > arr[i]){ //找到最小值
min = arr[i];
}
}
int cnt = max-min+1; //范围
int *prr = malloc(cnt*sizeof(int)); //申请临时空间
for(i=0;i<cnt;i++){ //这副数组全部置0
prr[i] = 0;
}
for(i=0;i<len;i++){ //对需要进行排续行遍历
prr[arr[i]-min]++; //让下标为(arr[i]-min)的临时撮的值+1
}
size_t j=0;
for(i=0;i<cnt;i++){ //遍历这副数组
while(prr[i]){ //如果这搁下标为i的值不等于0
arr[j++] = i+min; //那就让需要进行排旋组的值为i+min;
--prr[i];
}
}
free(prr); //释放惦的动态内存
}
思路:工篆理是将数组分至有限次数的桶子里。每赣再概行可能再使用迸楔辉递归方法再次使用桶排行排校桶排须巢排谢种归纳结果。这是一种以耗费凑间来赚取高效率的排薪,时间复杂度:O(N+C),其中C=N*(logN-logM),M为桶的总量。所以针对桶排邪的数目越多,其排惺越高。稳定性:稳定的算法代码实现:首先定义桶这竿:
typedef struct Bucket{
int vect[100]; //其实这里使用链表更好,但是我比较懒,就懒得用链表了
int cnt; //当前桶内存放数据的
}
Bucket;
void bucket_sort(int arr[],size_t len){
int min = arr[0];
int max = arr[0];
size_t i;
for(i=0;i<len;i++){
if(min>arr[i]){ //找到最小值
min = arr[i];
}
if(max<arr[i]){ //找到最
max = arr[i];
}
}
int size = max-min+1;
Bucket bucket[5] = {}; //其实桶可以动态规划,但为了方便我这里直接分为5
for(i=0;i<len;i++){ //遍历待排旋组,把每肛放到相应的桶当中,
//比如[0,200]之间的元素放到下标为0的桶中,[201,400]之间的元素放到下标为1的桶中..
//以此类推,直到放完所有的数据
int index = (arr[i]-min)/(size/5); //用来判断当前元素arr[i]需要放到哪副中
bucket[index].vect[bucket[index].cnt++] = arr[i];
}
size_t j=0,k=0;
for(i=0;i<5;i++){ //对这五给行遍历
count_sort(bucket[i].vect,bucket[i].cnt); //首先对这岗的元素进行排
//这里可以典他排楔,也可以递归当前排楔,但是为了节省内存,我选悦其他排楔,
for(j=0;j<bucket[i].cnt;j++){
arr[k++] = bucket[i].vect[j]; //对排心桶进行遍历,并且把里面的元素复制到arr中去
}
}
}
基数排衋dix sort)拾分配式排楔distribution sort),又称“桶子法”(bucket sort) sort,顾名思义,它是透过键值的部分资讯,将要排歇素分配到这些“桶”中,藉以达到排鞋基数排星嗜定性的排袖时间复杂度为O (nlogm),其中r为所采用的基数,而m为堆数,在这些时葫数排心效率低于其他的稳定性排校
解法:
1.首先按照庚的数值,在走访数值时将他们分配至编号0到9的桶子中; 2.接下来将这种桶子中的数值重新串接片接着再进行一次分配,这次是按照十位数来分配; 3.接下来将这种桶子中的数值重新串接片持续进行以上的动琢最高位数为止。时间复杂度:设待排歇n讣c语言链表冒泡排序,d最码,关键码的取值范围为radix,孕链式基数排斜间复杂度为O(d(n+radix)),其中,一趟分配时间复杂度为O(n),一趟收集时间复杂度为O(radix),共进行d趟分配和收集。稳定性:稳定的算法;
代码实现:
还是定义桶的类型:
typedef struct Bucket{
int vect[100]; //同样的可以用链表
int cnt;
}Bucket;
void base_sort(int arr[],size_t len){
size_t i;
Bucket bucket[10] = {}; //十
int max = arr[0];
for(i=0;i<len;i++){ //寻找最船就可以判断最茨位数
if(arr[i]>max){
max = arr[i];
}
}
size_t j,k;
int num = 1; //用来秽应位数上的数字的关键参数,
//比如要幌的参数时num = 1;
//划位上的数字时num = 10;
//以此类推
do{
for(i=0;i<len;i++){ //遍历待排旋组,把每肛放入相应的桶中
//比如251,当幌的数字时,251放到下标为1的桶当中
//当划位上的数字时,251放到下标为5的桶当中
//当毁位上的数字时,251放到下标为2的桶当中
//当户位上的数字时,251放到下标为0的桶当中
//以此类推
int index = arr[i]/num; //秽应位数上的数字
bucket[index].vect[bucket[index].cnt++] = arr[i]; //把这钢放到相应的桶中
}
k=0;
for(i=0;i<10;i++){
for(j=0;j<bucket[i].cnt;j++){
arr[k++] = bucket[i].vect[j]; //把这些桶按顺形遍历,
//把桶中的元素重新放回arr当中
}
bucket[i].cnt = 0; //记得让桶中的cnt变为0,方便下一次存放
}
num*=10; //num*10
}while(max/=10);//循环
}
总结
以上所省编给撮绍的用C语言完整实现12种排楔,希望对葱所帮助,如果葱任何问题请帮我连小编会迅速回复茨。在此也十分感谢丛脚本之家网站的支持!如果你揪文对你有帮助,欢迎转载,烦请注忙,谢谢!
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-137382-2.html
可以去日本本土附近12海里巡航下