/***********************************************************************
基數排序---用陣列模擬桶
思路:待排序陣列 。一個index[10]陣列。一個臨時陣列。
按照位數從低位開始排序。即是從個位開始。歸類。然後收集。在從十位開始,歸類。然後在收集。
分配--收集 這兩個過程
**********************************************************************/
#include <stdio.h>
#include <string.h>
void PrintArray(int a[],int len)
{
for(int i=0;i<len;i++)
printf("%d ",a[i]);
printf("\n");
}
// 獲取 int x的第bitnum位. 比如取23的第一位 返回3
int getdigit(int x,int bitnum)
{
int tmp[]={0,1,10,100}; // tmp[0]忽略。tmp[1]取個位,tmp[2]取十位,tmp[3]取百位
return (x/tmp[bitnum])%10;
}
/**********************************************************************
基數排序
************************************************************************/
void LsdRadixSort(int a[],int len,int maxbitnum)
{
int index[10]; // 索引陣列 0~9 索引值 比如 23 那麼個位的話,應該就是在index[3]內
int *Bucket=new int[len]; //用於臨時儲存收集使用
if(NULL==Bucket)
return ;
int i,j;
for(int k=1;k<=maxbitnum;k++) // 從個位開始-第一位
{
memset(index,0,sizeof(index)); //初始化
for(i=0;i<len;i++) // 統計某位上出現數總和。比如 index[0]=3表明個位為3的有3個數
++index[getdigit(a[i],k)];
for(i=1;i<10;i++)//統計至此索引為止共出現的個數比如 index[4]=5表明至此為止共有5個數了
index[i]=index[i]+index[i-1]; //也就是index[4] 應該成為桶陣列的第5個數(對應bucket[4])
for(i=len-1;i>=0;--i) // 按照某位進行分配 注 從右往左這樣保持穩定性
{
j=getdigit(a[i],k);
Bucket[index[j]-1]=a[i];
--index[j]; //注意要字自減
}
// 收集 bucket[i]至 a[]中
for(i=0;i<len;i++)
a[i]=Bucket[i];
}
delete [] Bucket;
Bucket=NULL;
}
int main()
{
int a[]={24,12,22,45,89,100,10};
puts("--------排序前----------");
int len=sizeof(a)/sizeof(int);
PrintArray(a,len);
LsdRadixSort(a,len,3);
puts("--------排序後----------");
PrintArray(a,len);
}