经典排序——基数排序LSD——C语言版
/*基数排序——LSD*/ /*一共10个桶,从个位开始,将元素按照每一位的数字分配到相应桶中,然后再重新收集,每次收集后,元素之间保持了相对位置(个位小的在前,经过重新分配后,依然保持个位小的在前)最后一次收集后元素将从小到大依次排列*/ #include <stdio.h> #define digit 4 //几位数字,随便设置 #define bucket_size 10 //每个桶的容量 /*选取数字函数*/ int number(int s,int i) { int k = 0,p; int cs; p=s; for(cs=0;cs<=i;cs++) { k=p%10; p=(p-k)/10; }//printf("%d ",k); return k; } int LSD_sort(int s[],int length) { int i,j,num,p,k; int bucket[10][bucket_size]; /*向桶中插入元素,从低位向高位*/ for(i=0;i<digit;i++) { p=0; int bucket_num[10]={ 0,0,0,0,0,0,0,0,0,0}; //记录每个桶里插入了多少元素 /*第一次为创建空桶,以后每次将桶清空*/ for (k=0;k<10;k++) { for (j=0;j<bucket_size;j++) { bucket[k][j]=0; } } for(j=0;j<length;j++) { num=number(s[j],i);//选取数字 bucket[num][bucket_num[num]]=s[j];//将元素插入桶中 bucket_num[num]++;//相应桶的下一个位置 } /*重新收集元素*/ for (j=0;j<10;j++) { int t=0; while(bucket_num[j]!=0) { s[p]=bucket[j][t]; t++; p++; bucket_num[j]--; } } } return *s; }
上一篇:
IDEA上Java项目控制台中文乱码