Thursday, July 7, 2011

Program for Radix sort

#include<stdio.h>
#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