#include<conio.h>
#define MAX 20
void radixsort(int x[],int n);
int power(int x,int y);
void main()
{
int x[MAX];
int n,i;
char ans;
clrscr();
do
{
printf("\nEnter length of array: ");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("Enter element %d: ",i+1);
scanf("%d",&x[i]);
}
radixsort(x,n);
printf("\nSorted array is:");
for(i=0;i<n;i++)
printf("%d\t",x[i]);
printf("\n Do you want to continue?('y' for Yes & 'n' for No):");
ans= getche();
}while ((ans=='y')||(ans=='Y'));
getch();
}
void radixsort(int x[] , int n)
{
int front[10],rear[10];
struct
{
int info;
int next;
}NODE[MAX];
int exp,first,i,j,k,p,q,y;
// Initialize linked list
for(i=0; i<n-1; i++)
{
NODE[i].info=x[i];
NODE[i].next=i+1;
}
NODE[n-1].info=x[n-1];
NODE[n-1].next=-1;
first=0; // First is the head of linked list
for(k=1;k<5;k++) // Assume we have 4 digit numbers
{
// Inilialize queues
for(i=0;i<10;i++)
{
rear[i] = -1;
front[i] = -1;
}
// Process each element on the list
while(first!=-1)
{
p = first;
first = NODE[first].next;
y = NODE[p].info;
exp = power(10,k-1); //Extarct kth digit
j = (y/exp)%10;
q = rear[j]; // Insert y into queue[j]
if(q == -1)
front[j]=p;
else
NODE[q].next=p;
rear[j]=p;
}
/* At this point each record is in its proper queue based on digit k. we nnow form a single list from all the queue elements. Find the first element*/
for(j=0;j<10 && front[j]==-1;j++)
first=front[j];
// Link up remaining queues
while(j<10)
{
for(i=j+1;i<10 && front[i]==-1;i++)
if(i<10)
{
p=i;
NODE[rear[j]].next=front[i];
}
j=i;
}
NODE[rear[p]].next=-1;
} // end of while
// Copy back to original array
for(i=0;i<n;i++)
{
x[i]=NODE[first].info;
first=NODE[first].next;
}
NODE[rear[j]].next=front[i];
}
int power(int x,int y)
{
int z,pow;
pow=1;
for(z=0; z<y; z++)
pow * = x;
return(pow);
}
No comments:
Post a Comment