利用链表的思路实现基数排序
在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;
}