基数排序的数组/链表实现

本文介绍了基数排序的两种实现方式,分别是使用数组和链表。核心代码包括radixSortByArr()和radixSortByList()函数,前者通过数组进行计数,后者利用10个链表分别存储每个位的数字,按照位数从低位到高位进行排序。最后,文章提供了完整的C语言实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/************************************************************
*基数排序
*使用数组/链表完成
*核心代码: radixSortByArr(int arr[], int n) / radixSortByList(int arr[], int n)
*使用数组实现的算法核心: res[ arr[i] ]+=1 ; //将待排序数组的值当作索引计数(res[20]=2;表示有2个20)
*使用链表实现的算法核心: 循环MaxBit次。从低位到高位,每次排序一位。
                          使用链表记录每次的排序结果,采用尾查法实现链表内部的排序
                          一趟排序结束,将结果输出到待排序数组中
*author: fangchang
*date:   2016/03/25
*time:   11:34
**************************************************************/


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


#define N 5                        //待排序数的个数
#define RADIX_NUM 10               //桶的个数,0-9共10个数字,所以是10    


typedef struct node {              //链表的节点声明
int value;
struct node *next;
}*pnode;


void deleteList(pnode head);                 //清空链表
void insertInEnd(pnode head,int value);      //尾插
void answer1();
void radixSortByArr(int arr[], int n);      //使用数组实现基数排序(所有的数字都是正整数)


void answer2();
void radixSortByList(int arr[], int n);      //core code 
void printToArr(pnode radixArr[],int arr[], int n);
int findMax(int arr[] , int n);              //数组中的最大值
int maxBitNum(int value);                    //最大值的位数(111的位数是3)
int valueInBit(int value, int bitNum);       //返回指定位(bitNum)上的数字(0-9)
int main() {
//answer1();
answer2();
fflush(stdin);
getchar();
return 1;
}


void answer1(){                                 //使用数组完成基数排序
int arr[N]={1,2,2,11,3};
radixSortByArr(arr,N);
}
void radixSortByArr(int arr[], int n) {        //基数排序(数据结构: 数组)
int i;
int max=0;
int *res;
int len;
for(i=0;i<n;++i) {
if(max<arr[i]) {
max=arr[i];
}
}
len=max+1;
res = (int *) malloc(sizeof(int)*(max+1));
if(!res) {
return;
}
memset(res,0,len*sizeof(int));
for(i=0;i<n;++i) {
res[ arr[i] ]+=1;                  //core code
}
for(i=1;i<=len;++i) {
for(res[i];res[i]>0;--res[i]) {
printf("%d  ",i);
}
}
printf("\n");



void answer2() {                                //使用10个链表完成基数排序 
int arr[N]={111111,232,2,11,3};
radixSortByList(arr,N);
}
void radixSortByList(int arr[], int n) {         //基数排序(数据结构: 链表)  
int loopNum = maxBitNum(findMax(arr,n));
pnode radixArr[RADIX_NUM] ;                               //保存10个链表,radixArr[0]保存相应位为0的数
int i,j,tmp;
pnode p;
for(i=0;i<RADIX_NUM;++i) {                                //初始化10个链表头结点
p = (pnode) malloc(sizeof(struct node));
if(!p) {
printf("radixSortByList malloc has error!\n");
return ;
}
p->value=0;
p->next=NULL;
radixArr[i] = p ;
}
for(i=0;i<loopNum;++i) {                       //最多有loopNum位,则循环loopNum次
for(j=0;j<n;++j) {                         //遍历待排序数字
tmp = valueInBit(arr[j],i+1);          //得到每个数字相应位上的数
insertInEnd(radixArr[tmp],arr[j]);     //插入到相应的链表中
}                                          //一趟排序
printToArr(radixArr,arr,n);                //更新待排序数组(将排序结果存入数组中)
for(j=0;j<RADIX_NUM;++j) {                 //删除桶中数据,即清空链表数组
p=radixArr[j]->next;
radixArr[j]->next=NULL;
deleteList(p);
}
}
for(i=0;i<n;++i) {                            //打印最终排序结果
printf("%d  ",arr[i]);
}
printf("\n");
}




void printToArr(pnode radixArr[],int arr[], int n) {             //更新待排序数组(将排序结果存入数组中)
int i;
int j=0;
pnode p;
for(i=0;i<RADIX_NUM; ++i) {
p=radixArr[i]->next;
while(p) {
arr[j++] = p->value;
p=p->next;
}
}
}


int findMax(int arr[], int n) {                        //输出数组中最大的数
int i;
int max=0;
for(i=0;i<n;++i) {
if(max<arr[i]) {
max=arr[i];
}
}
return max;
}


int maxBitNum(int value) {                           //输出数组中最大数的位数(111的位数是3)
int i=0;
do{
i++;
value/=10;
}while(value);
return i;
}


int valueInBit(int value, int bitNum) {            //相应bitNum位上的数字
int i;
while(bitNum) {
i = value%10;
value/=10;
bitNum--;
}
return i;
}


void insertInEnd(pnode head,int value) {                              //尾部插入数据
pnode p;
pnode cur;
if(NULL==head) {
return;
}
p=head;
while(p->next) {
p=p->next;
}
cur=(pnode) malloc(sizeof(struct node));
if(!cur) {
return;
}
cur->value = value;
cur->next = NULL;
p->next=cur;
}


void deleteList(pnode head){                        //清空链表
pnode next=NULL;
pnode cur=NULL;
if(NULL==head) {
return;
}
cur=head;
while(cur) {
next=cur->next;
free(cur);
cur=next;
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值