基数排序的一种实现

利用链表的思路实现基数排序
在code::blocks 17.12中运行正常

#include <stdio.h>
#include <stdlib.h>

/**6 基数排序**/
typedef struct node{//以链表为实现方式
    int* data;//array里的地址
    struct node* pNext;//链接到下一个节点
}node;

int size=15;
int array[15]={3221,1,10,9680,577,9420,7,5622,4793,2030,3138,82,2599,743,4127};
int temp[15];//暂时存储排序顺序的临时数组

node* barrel[10];//node*格式的10个桶

int radix_sort(){
    int base=10;//X%base计算出余数(mod)
    int submod=1;//mod/submod计算出某位的值
    int max=0;//计算最大值需要的变量,计算最大值以找到终点
    while(1){
        init_barrel();//对桶做初始化处理,去除上次的变量
        for(int i=0;i<size;i++){
            if(array[i]>max){
                max=array[i];//计算最大值
            }
            add_to_barrel(&array[i],(array[i]%base)/submod);
            //把array[i]的地址放在(array[i]%base)/submod桶里。
        }
        sort_to_temp();
        back_to_array();
        print_array();
        base*=10;
        submod*=10;
        if(base/10>=max){
            break;
        }
    }
}

//把address地址放在key号桶中
void add_to_barrel(int* address,int key){
    node* position;
    position=barrel[key];
    while(1){
        if(position->data==NULL){//如果链表中data没有内容,就把要填入的地址填入,并malloc下一块内容
            //printf("到头了\n");
            position->data=address;
            position->pNext=(node*)malloc(sizeof(node));
            position->pNext->data=NULL;
            position->pNext->pNext=NULL;
            break;
        }else if(position->data!=NULL){//如果链表中data有内容,就沿着链表去下一节点
            //printf("下一级\n");
            position=position->pNext;
        }
    }
}

//把桶里的内容放到依次放到temp数组中
void sort_to_temp(){
    node* position;
    int j=0;//temp的指针
    int i=0;//barrel的指针
    for(;i<10;i++){
        position=barrel[i];
        while(position->data!=NULL){
            //printf("放回%d\n",*position->data);
            temp[j++]=*position->data;
            position=position->pNext;
        }
    }
}

//把temp数组复制回array数组
void back_to_array(){
    for(int i=0;i<size;i++){
        array[i]=temp[i];
    }
}

//对桶进行初始化,先free再malloc
void init_barrel(){
    for(int i=0;i<10;i++){
        free(barrel[i]);
        barrel[i]=(node*)malloc(sizeof(node));
        barrel[i]->data=NULL;
        barrel[i]->pNext=NULL;
    }
}

void print_array(){
    for(int i=0;i<size;i++){
        printf("[%d]%d ",i,array[i]);
    }
    printf("\n");
}

void print_temp(){
    for(int i=0;i<size;i++){
        printf("[%d]%d ",i,temp[i]);
    }
}

int main()
{
    radix_sort();
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值