基數排序--陣列模擬桶結構

YunShell發表於2014-03-19
/***********************************************************************
基數排序---用陣列模擬桶
思路:待排序陣列 。一個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);
}

相關文章