基數排序:
#include<math.h>testBS()
{
inta[]?=?{2,?343,?342,?1,?123,?43,?4343,?433,?687,?654,?3};
int?*a_p?=?a;
//計算數組長度
intsize?=?sizeof(a)?/?sizeof(int);
//基數排序
bucketSort3(a_p,?size);
//打印排序後結果
inti;
for(i?=?0;?i?<?size;?i++)
{
printf("%d\n",?a[i]);
}
intt;
scanf("%d",?t);
}
//基數排序
voidbucketSort3(int?*p,?intn)
{
//獲取數組中的最大數
intmaxNum?=?findMaxNum(p,?n);
//獲取最大數的位數,次數也是再分配的次數。
intloopTimes?=?getLoopTimes(maxNum);
inti;
//對每壹位進行桶分配
for(i?=?1;?i?<=?loopTimes;?i++)
{
sort2(p,?n,?i);
}
}
//獲取數字的位數
intgetLoopTimes(intnum)
{
intcount?=?1;
inttemp?=?num?/?10;
while(temp?!=?0)
{
count++;
temp?=?temp?/?10;
}
returncount;
}
//查詢數組中的最大數
intfindMaxNum(int?*p,?intn)
{
inti;
intmax?=?0;
for(i?=?0;?i?<?n;?i++)
{
if(*(p?+?i)?>?max)
{
max?=?*(p?+?i);
}
}
returnmax;
}
//將數字分配到各自的桶中,然後按照桶的順序輸出排序結果
voidsort2(int?*p,?intn,?intloop)
{
//建立壹組桶此處的20是預設的根據實際數情況修改
intbuckets[10][20]?=?{};
//求桶的index的除數
//如798個位桶index=(798/1)%10=8
//十位桶index=(798/10)%10=9
//百位桶index=(798/100)%10=7
//tempNum為上式中的1、10、100
inttempNum?=?(int)pow(10,?loop?-?1);
inti,?j;
for(i?=?0;?i?<?n;?i++)
{
introw_index?=?(*(p?+?i)?/?tempNum)?%?10;
for(j?=?0;?j?<?20;?j++)
{
if(buckets[row_index][j]?==?NULL)
{
buckets[row_index][j]?=?*(p?+?i);
break;
}
}
}
//將桶中的數,倒回到原有數組中
intk?=?0;
for(i?=?0;?i?<?10;?i++)
{
for(j?=?0;?j?<?20;?j++)
{
if(buckets[i][j]?!=?NULL)
{
*(p?+?k)?=?buckets[i][j];
buckets[i][j]?=?NULL;
k++;
}
}
}
}
桶排序
#include?<stdio.h>#define?MAXNUM?100
void?bucksort(int?arr[],?int?N,?int?M)
{
int?count[MAXNUM];
for?(int?i=0;?i<=M;?i++)
{
count[i]=0;
}
for?(int?i=0;?i<N;?i++)
{
++count[arr[i]];
}
for?(int?i=0;?i<=M;?i++)
{
for?(int?j=1;?j<=count[i];?j++)
{
printf("%d?",i);
}
}
}
int?main()
{
int?a[]={2,5,6,12,4,8,8,6,7,8,8,10,7,6};
bucksort(a,sizeof(a)/sizeof(a[0]),12);
return?0;
}