1. 程式人生 > >排序演算法之基數

排序演算法之基數

     基數排序(radixsort)則是屬於“分配式排序”,基數排序法又稱“桶子法”,它是透過鍵值的部份資訊,將要排序的元素分配至某些“桶”中,藉以達到排序的作用。

       基數排序法是穩定的排序,其時間複雜度為O(d(r+m)),其中r為所採取的基數,而m為堆數,在某些時候,基數排序法的效率高於其它的比較性排序法。基數排序的發明可以追溯到1887年赫爾曼·何樂禮在打孔卡片製表機(Tabulation Machine)上的貢獻。

基數排序原理
以364 , 565 ,165 ,551為例
裝桶如下表,由低位向高位開始排序,第一次排序

3 6 4
5 6 5
1 6 5
5 5 1
第二次排序
5 5 1
3 6 4
5 6 5
1 6 5
第三次排序
5 5 1
3 6 4
5 6 5
1 6 5
結果
1 6 5
3 6 4
5 5 1
5 6 5
是不是超級簡單呢,下面我們來看看如何實現上訴演算法呢?
int GetNumPos(int num,int pos)
{
	int flag=1;
	for(int i=0;i<pos-1;i++)
		flag*=10;
	return (num/flag)%10;
}
void RadixSort(int *pDataArr,int iDataNum)
{
	int *radixArr[RADIX_10];//分別為0-9的序列空間
	for(int i=;i<10;i++)
	{
		radixArr[i]=(int *)malloc(sizeof(int)*(iDataNum+1));
		radixArr[i][0]=0;
	}
	for(int pos=1;pos<=KeyNum;pos++)
	{
		for(int i=0;i<iDataNum;i++)
		{
			int num=GetNumPos(pDateArr[i],pos);
			int index=++radixArr[num][0];
			radixArr[num][indix]=pDataArr[i];
		}
		for(int i=0,j=0;i<RADIX_10;i++)
		{
			for(int k=1;k<=radixArr[i][0];k++)
				pDataArr[j++]=radixArr[i][k];
				radixArr[i][0]=0;
				}
}