基数排序
LSD低位优先: 从低位开始分组,高位相同的自动有序
MSD高位优先
核心思想
LSD 使用分组的思想,分析数字之间的规律,先按照个位分组(需要尾添加),高位在低位的基础之上,进行在分组,直至最高为,利用数字的排序,是非比较的排序
- 找最大值
- 最大值的位数
- 按位入桶
- 释放
代码
#include<stdio.h>
#include<stdlib.h>
/*LSD*/
typedef struct Date
{
int nValue;
struct Date * pNext;
}Bucket;
void insert(Bucket ** bucketlist,int nValue)
{
Bucket * pTemp = (Bucket *)malloc(sizeof(Bucket));
pTemp->pNext = NULL;
pTemp->nValue = nValue;
Bucket * pMark = *bucketlist;
if(pMark == NULL)
{
*bucketlist = pTemp;
return;
}
while(pMark->pNext != NULL)
{
pMark = pMark -> pNext;
}
pMark->pNext = pTemp;
}
void RadixSort(int arr[],int nlength)
{
//1.找最大值
int nMax = arr[0];
int i;
for(i = 1; i < nlength ; i ++ )
{
if(nMax < arr[i])
{
nMax = arr[i];
}
}
// 2. 最大值位数
int nCount = 1; //基数
int nNum = 0;
while((nMax = nMax / 10) != 0)
{
nNum = nNum + 1;
}
//创建桶
Bucket ** bucketlist = (Bucket **)malloc(sizeof(Bucket *) * 10);
for(i = 0 ; i < 10 ; i ++ )
{
bucketlist[i] = NULL;
}
// 3.按位入桶
int j;
for(i = 0 ; i <= nNum ; i++ )
{
for(j = 0 ; j < nlength ; j ++)
{
insert(&bucketlist[arr[j]/nCount%10],arr[j]);
}
//放回原数组
int k = 0;
int q;
Bucket * list = NULL;
Bucket * pDel = NULL;
while(k < nlength)
{
for(q = 0; q < 10 ; q ++ )
{
list = bucketlist[q];
while(list != NULL)
{
pDel = list;
arr[k] = list->nValue;
k ++;
list = list ->pNext;
free(pDel);
pDel = NULL;
}
}
}
nCount = nCount * 10;
for( q = 0 ; q < 10 ; q ++ )
{
bucketlist[q] = NULL;
}
}
}