//桶式排序bucket sort
//radix sort较小的数作为基数,采取多趟桶式排序的方法。具体做法是最低有效位优先,将各数放入痛中;然后调整,依次类推到最高有效位。
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
#define BUKETSIZE 10
typedef struct listitem
{
int _value;
struct listitem* _next;
};
struct listitem bucket[BUKETSIZE];
void reverse(char s[])
{
int c,i,j;
for(i=0,j=strlen(s)-1;i<j;i++,j--)
{
c=s[i];
s[i]=s[j];
s[j]=c;
}
}
void itoa(int n,char s[])
{
int i=0;
do{
s[i++]=abs(n%10)+'0';
}while(n/=10);
s[i]='/0';
reverse(s);
}
int num_of_index(int n,int index)
{
char s[20];
itoa(n,s);
int num=strlen(s)-index;
if(num<0) return 0;
char x=s[num];
int y=x-'0';
return y;
}
void bucket_insert(int a[],int size,int index)
{
int i;
for(i=0;i<size;i++)
{
bucket[i]._value=0;
bucket[i]._next=NULL;
}
for(i=0;i<size;i++)
{
//将按照index位数字的大小放置进bucket中
int position=num_of_index(a[i],index);
struct listitem *newlistitem=&bucket[position];
while(newlistitem->_next !=NULL&&newlistitem->_next->_value<=a[i])
{
newlistitem=newlistitem->_next;
}
struct listitem *newadd=malloc(sizeof(struct listitem));
newadd->_value=a[i];
newadd->_next=newlistitem->_next;
newlistitem->_next=newadd;
}
}
void bucket_clear()
{
int i;
struct listitem *p;
for(i=0;i<BUKETSIZE;i++)
{
p=bucket[i]._next;
while(p!=NULL)
{
struct listitem *del=p;
p=p->_next;
free(del);
}
bucket[i]._value=0;
bucket[i]._next=NULL;
}
}
void bucket_ouput(int to[],int size)
{
int i,j=0;
struct listitem *p;
for(i=0;i<BUKETSIZE;i++)
{
p=bucket[i]._next;
while(p!=NULL)
{
to[j++]=p->_value;
printf("%d ",p->_value);
p=p->_next;
}
printf("/n");
}
}
void radix_sort(int a[],int size)
{
int i=0;
int maxsize=0;
int tempsize;
char n[10];
for(i=0;i<size;i++)
{
itoa(a[i],n);
tempsize=strlen(n);
if(tempsize>maxsize) maxsize=tempsize;
}
for(i=0;i<maxsize;i++)
{
bucket_insert(a,size,i+1);
bucket_ouput(a,size);
bucket_clear();
}
}
int main()
{
int a[6]={1,243,45,65,43,23};
radix_sort(a,6);
printf("/n");
int i;
for(i=0;i<6;i++)
printf(" %d ",a[i]);
printf("/n");
return 0;
}
//radix sort较小的数作为基数,采取多趟桶式排序的方法。具体做法是最低有效位优先,将各数放入痛中;然后调整,依次类推到最高有效位。
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
#define BUKETSIZE 10
typedef struct listitem
{
int _value;
struct listitem* _next;
};
struct listitem bucket[BUKETSIZE];
void reverse(char s[])
{
int c,i,j;
for(i=0,j=strlen(s)-1;i<j;i++,j--)
{
c=s[i];
s[i]=s[j];
s[j]=c;
}
}
void itoa(int n,char s[])
{
int i=0;
do{
s[i++]=abs(n%10)+'0';
}while(n/=10);
s[i]='/0';
reverse(s);
}
int num_of_index(int n,int index)
{
char s[20];
itoa(n,s);
int num=strlen(s)-index;
if(num<0) return 0;
char x=s[num];
int y=x-'0';
return y;
}
void bucket_insert(int a[],int size,int index)
{
int i;
for(i=0;i<size;i++)
{
bucket[i]._value=0;
bucket[i]._next=NULL;
}
for(i=0;i<size;i++)
{
//将按照index位数字的大小放置进bucket中
int position=num_of_index(a[i],index);
struct listitem *newlistitem=&bucket[position];
while(newlistitem->_next !=NULL&&newlistitem->_next->_value<=a[i])
{
newlistitem=newlistitem->_next;
}
struct listitem *newadd=malloc(sizeof(struct listitem));
newadd->_value=a[i];
newadd->_next=newlistitem->_next;
newlistitem->_next=newadd;
}
}
void bucket_clear()
{
int i;
struct listitem *p;
for(i=0;i<BUKETSIZE;i++)
{
p=bucket[i]._next;
while(p!=NULL)
{
struct listitem *del=p;
p=p->_next;
free(del);
}
bucket[i]._value=0;
bucket[i]._next=NULL;
}
}
void bucket_ouput(int to[],int size)
{
int i,j=0;
struct listitem *p;
for(i=0;i<BUKETSIZE;i++)
{
p=bucket[i]._next;
while(p!=NULL)
{
to[j++]=p->_value;
printf("%d ",p->_value);
p=p->_next;
}
printf("/n");
}
}
void radix_sort(int a[],int size)
{
int i=0;
int maxsize=0;
int tempsize;
char n[10];
for(i=0;i<size;i++)
{
itoa(a[i],n);
tempsize=strlen(n);
if(tempsize>maxsize) maxsize=tempsize;
}
for(i=0;i<maxsize;i++)
{
bucket_insert(a,size,i+1);
bucket_ouput(a,size);
bucket_clear();
}
}
int main()
{
int a[6]={1,243,45,65,43,23};
radix_sort(a,6);
printf("/n");
int i;
for(i=0;i<6;i++)
printf(" %d ",a[i]);
printf("/n");
return 0;
}