排序演算法之基數
阿新 • • 發佈:2018-12-21
基數排序(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; } }