排序算法寫了n種,可不像孔乙己一樣考驗"茴香豆"的"茴"字有幾種寫法,而是思維的一種拓展,等到使用的時候根據特定的場景變能靈活的選取更加合適的算法。今日所記錄的是基數排序。
一. 算法描述
二. 算法分析
平均時間複雜度:O(dn)(d即表示整形的最高位數)
空間複雜度:O(10n) (10表示0~9,用於存儲臨時的序列)
穩定性:穩定
三. 算法實現
/********************************************************
*函數名稱:GetNumInPos
*參數說明:num 一個整形數據
* pos 表示要獲得的整形的第pos位數據
*說明: 找到num的從低到高的第pos位的數據
*********************************************************/
int GetNumInPos(int num,int pos)
{
int temp = 1;
for (int i = 0; i < pos - 1; i++)
temp *= 10;
return (num / temp) % 10;
}
/********************************************************
*函數名稱:RadixSort
*參數說明:pDataArray 無序數組;
* iDataNum爲無序數據個數
*說明: 基數排序
*********************************************************/
#define RADIX_10 10 //整形排序
#define KEYNUM_31 10 //關鍵字個數,這裏爲整形位數
void RadixSort(int* pDataArray, int iDataNum)
{
int *radixArrays[RADIX_10]; //分別爲0~9的序列空間
for (int i = 0; i < 10; i++)
{
radixArrays[i] = (int *)malloc(sizeof(int) * (iDataNum + 1));
radixArrays[i][0] = 0; //index爲0處記錄這組數據的個數
}
for (int pos = 1; pos <= KEYNUM_31; pos++) //從個位開始到31位
{
for (int i = 0; i < iDataNum; i++) //分配過程
{
int num = GetNumInPos(pDataArray[i], pos);
int index = ++radixArrays[num][0];
radixArrays[num][index] = pDataArray[i];
}
for (int i = 0, j =0; i < RADIX_10; i++) //收集
{
for (int k = 1; k <= radixArrays[i][0]; k++)
pDataArray[j++] = radixArrays[i][k];
radixArrays[i][0] = 0; //復位
}
}
}
轉載自:http://blog.csdn.net/cjf_iceking/article/details/7943609