radix sort &&bucket sort
2008-08-02 14:28
239 查看
//桶式排序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;
}
相关文章推荐
- 线性时间的排序 - Decision Tree Model & Counting Sort & Radix Sort & Bucket Sort
- 【CLRS】《算法导论》读书笔记(三):计数排序(Counting sort)、基数排序(Radix sort)和桶排序(Bucket sort)
- 计数排序(Counting Sort)、桶排序(Bucket Sort)和基数排序(Radix Sort)
- Groupon面经Prepare: Sort given a range && Summary: Bucket Sort
- 基于非比較的排序:计数排序(countSort),桶排序(bucketSort),基数排序(radixSort)
- count sort, radix sort, bucket sort
- 桶排序(Bucket Sort),基数排序(Radix_Sort)
- 基于非比较的排序:计数排序(countSort),桶排序(bucketSort),基数排序(radixSort)
- 排序之线性排序(counting sort, radix-sort, bucket-sort)
- 【算法】基数排序应用于浮点数 (Radix sort deal with float number)
- 数据结构实验之排序三:bucket sort
- HDOJ 2078 复习时间 (贪心&sort)
- Insertion Sort List & Gas Station & Distinct Subsequences
- C#中List<T>的排序用法(Sort)
- Hive 基础之:分区、桶、Sort Merge Bucket Join
- Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) B(模拟) && codeforce 724B Batch Sort
- LeetCode WiggleSort I && II
- 算法学习笔记--2. Selection sort & Fibonacci sequence
- 数据结构基础(1) --Swap & Bubble-Sort & Select-Sort
- Hadoop系列之Terasort<转>