#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <limits.h>
#define MAXLEN 10
typedef struct
{
int key;
int value[MAXLEN];
int len;
}SortType;
void printA(int a[],int len)
{
for(int i=1;i<=len;i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
void countingSort(int a[],int *b,int len,int k,int n)
{
SortType *c=(SortType*)malloc((k+1)*sizeof(SortType));
int i;
for(i=0;i<=k;i++)
{
c[i].key=0;
c[i].len=0;
}
for(i=1;i<=len;i++)
{
int k2=a[i]%(int)pow(10.0,n);
k2=k2/(int)pow(10.0,n-1);
c[k2].key++;
c[k2].len++;
c[k2].value[c[k2].len]=a[i];
}
for(i=1;i<=k;i++)
{
c[i].key+=c[i-1].key;
}
for(i=len;i>=1;i--)
{
int k2=a[i]%(int)pow(10.0,n);
k2=k2/(int)pow(10.0,n-1);
b[c[k2].key]=c[k2].value[c[k2].len];
c[k2].key--;
c[k2].len--;
}
free(c);
}
void radixSort(int a[],int len,int n,int N)
{
if(n>N)
return;
int *b=(int*)malloc((len+1)*sizeof(int));
countingSort(a,b,len,9,n);
//printA(b,len);
for(int j=0;j<=len;j++)
{
a[j]=b[j];
}
radixSort(a,len,++n,N);
free(b);
}
void main()
{
int a[6]={INT_MIN,987,976,654,632,321};
radixSort(a,5,1,3);
printA(a,5);
getchar();
}
算法导论 基数排序
最新推荐文章于 2018-08-09 16:24:42 发布