经典排序——桶排序——C语言版

来源:互联网 发布:电视软件下载 编辑:程序博客网 时间:2024/06/06 23:54
/*桶排序——最多两位数*//*申请和分配每个桶的空间,将数组插入桶中,本程序为每个数除以10,即每个桶内进行个位排序,之后按顺序从每个桶内把数据取出排列到数组内*/#include <stdio.h>#include <stdlib.h>#define bucket_size 15//有多少个桶 15可以最大排到150typedef struct node{    int key;    struct node *next;}keynode;int bucket_sort(int s[],int size){    /*申请空间*/    keynode *bucket_table = (keynode*) malloc(sizeof(keynode)*size);    /*创建桶*/    int i;    for(i=0;i<bucket_size;i++)    {        /*每个桶的元素的空间分配*/        bucket_table[i]=*(keynode*)malloc(sizeof(keynode));        bucket_table[i].key=0;        bucket_table[i].next= NULL;    }    /*开始向桶插入元素*/    for(i=0;i<size;i++)    {        /*给每个数组元素申请空间*/       keynode *node =(keynode*)malloc(sizeof(keynode));        /*给每个节点赋值*/        node->key=s[i];        node->next=NULL;        int bucket_number= s[i]/10;        keynode *p=&bucket_table[bucket_number];        /*桶里没有任何元素*/       if(p->next== NULL && p->key==0)/*个位数*/       {           bucket_table[bucket_number].next =node;           (bucket_table[bucket_number].key)++;       }        /*桶里已有元素,要通过比较插入*/        else        {          while(p->next!=NULL && p->next->key <= node->key)          {              p=p->next;              (bucket_table[bucket_number].key)++;          }            node->next=p->next;            p->next=node;        }    }    int num=0;    keynode *k=&bucket_table[num];    for(i=0;i<size;i++)    {        if(k->next==NULL)        {            num++;            i--;            *k=bucket_table[num];        }        else        {            s[i]=k->next->key;            k=k->next;        }    }    return *s;}int main(){    int s[5];    int n,i;    n=5;    for(i=0;i<n;i++)    {        scanf("%d",&s[i]);    }    bucket_sort(s,n);    for(i=0;i<n;i++)    {        printf("%d ",s[i]);    }}
0 0
原创粉丝点击