/*********************\
* 基数排序(桶排序)*
\*********************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
//struct of node
typedef struct node{
int num;
struct node * next;
}NODE;
/*!<链表尾部添加节点*/
void addnode(NODE * head,int num)
{
NODE * temp = head;
while(temp->next)temp=temp->next;
NODE * newnode = (NODE*)malloc(sizeof(NODE));
newnode->next = NULL;
newnode->num = num;
temp->next=newnode;
}
/*!<释放所有链表空间*/
void freelist(NODE * head)
{
NODE * temp;
while(head)
{
temp = head;
head = head->next;
free(temp);
}
}
/*!<清空链表,只留表头*/
void clearlist(NODE * head)
{
NODE * p = head->next;
NODE * q;
head->next = NULL;
while(p)
{
q = p;
p = p->next;
free(q);
}
}
/*!<打印链表数据*/
void printlist(NODE * head)
{
NODE * temp = head->next;
while(temp)
{
printf("->%d",temp->num);
temp=temp->next;
}
putchar('\n');
}
/*!<基数排序函数*/
void RadixSort(int a[],int bass,int n)
{
int max = 0,i,j,k=0,iTemp,sort_times;
NODE ** barrel;
//确定排序趟数
for(i=0;i<n;i++)
if(a[i]>max)max=a[i];
for(sort_times=0;pow(bass,sort_times)<max;sort_times++);
barrel = (NODE**)malloc(bass*sizeof(NODE*));
//初始化桶
for(i=0;i<bass;i++)
{
NODE * node = (NODE*)malloc(sizeof(NODE));
node->next = NULL;
barrel[i]=node;
}
//排序
for(i=0;i<sort_times;i++)
{
for(j=0;j<n;j++)
{
iTemp = a[j]%(int)round(pow(bass,i+1));
iTemp = iTemp/(int)round(pow(bass,i));
addnode(barrel[iTemp],a[j]);
}
//打印桶内数据
printf("第 %d 趟排序桶内数据情况:\n",i);
for(j=0;j<bass;j++)
{
printf("barrel[%d]",j);
printlist(barrel[j]);
}
for(j=0,k=0;j<bass;j++)
{
NODE * temp=barrel[j]->next;
while(temp)
{
a[k++]=temp->num;
temp=temp->next;
if(k>n) break;
}
}
//打印每趟排序后的结果
printf("第 %d 趟排序后队列情况:\n",i);
for(j=0;j<n;j++)
{
printf("%d ",a[j]);
}
putchar('\n');
//清空桶
for(j=0;j<bass;j++) clearlist(barrel[j]);
}
//释放空间
for(i=0;i<bass;i++) freelist(barrel[i]);
}
/*!< func main*/
int main(void)
{
int i = 0,n,bass;
int a[] = {1,6,2,8,3,25,66,7,3,5,634,633,643,2465,2355,2120};
n=sizeof(a)/sizeof(int);
printf("请输入基数排序的基数:\n");
scanf("%d",&bass);
printf("--排序前--: \n");
for(i=0;i<n;i++) printf(" %d ",a[i]);
putchar('\n');
RadixSort(a,bass,n);
printf("--排序后--: \n");
for(i=0;i<n;i++)printf(" %d ",a[i]);
putchar('\n');
system("pause");
return 0;
}
执行情况:
请输入基数排序的基数:
10
--排序前--:
1 6 2 8 3 25 66 7 3 5 634 633 643 2465 2355 2120
第 0 趟排序桶内数据情况:
barrel[0]->2120
barrel[1]->1
barrel[2]->2
barrel[3]->3->3->633->643
barrel[4]->634
barrel[5]->25->5->2465->2355
barrel[6]->6->66
barrel[7]->7
barrel[8]->8
barrel[9]
第 0 趟排序后队列情况:
2120 1 2 3 3 633 643 634 25 5 2465 2355 6 66 7 8
第 1 趟排序桶内数据情况:
barrel[0]->1->2->3->3->5->6->7->8
barrel[1]
barrel[2]->2120->25
barrel[3]->633->634
barrel[4]->643
barrel[5]->2355
barrel[6]->2465->66
barrel[7]
barrel[8]
barrel[9]
第 1 趟排序后队列情况:
1 2 3 3 5 6 7 8 2120 25 633 634 643 2355 2465 66
第 2 趟排序桶内数据情况:
barrel[0]->1->2->3->3->5->6->7->8->25->66
barrel[1]->2120
barrel[2]
barrel[3]->2355
barrel[4]->2465
barrel[5]
barrel[6]->633->634->643
barrel[7]
barrel[8]
barrel[9]
第 2 趟排序后队列情况:
1 2 3 3 5 6 7 8 25 66 2120 2355 2465 633 634 643
第 3 趟排序桶内数据情况:
barrel[0]->1->2->3->3->5->6->7->8->25->66->633->634->643
barrel[1]
barrel[2]->2120->2355->2465
barrel[3]
barrel[4]
barrel[5]
barrel[6]
barrel[7]
barrel[8]
barrel[9]
第 3 趟排序后队列情况:
1 2 3 3 5 6 7 8 25 66 633 634 643 2120 2355 2465
--排序后--:
1 2 3 3 5 6 7 8 25 66 633 634 643 2120 2355 2465
请按任意键继续. . .
分享到:
相关推荐
包括了基数排序的实现代码和流程图。 先对个位数字进行统计,然后根据个位进行排序,然后对十位进行统计,然后根据十位进行排序,即可获得最终结果。 时间效率:待排序列为n个记录,10个关键码,关键码的取值范围为0...
基数排序基数排序基数排序基数排序基数排序
数据结构基数排序数据结构基数排序数据结构基数排序数据结构基数排序数据结构基数排序数据结构基数排序
数据结构之基数排序数据结构之基数排序数据结构之基数排序数据结构之基数排序数据结构之基数排序
基数排序(radix sort)又称桶排序(bucket sort),相对于常见的比较排序,基数排序是一种分配式排序,需要将关键字拆分成数字位。并且按照数字位的值对数据项进行排序,这种方法不需要进行比较操作。 为了尽可能少的...
基数排序法用链表完成使用C语言适用于刚入门的学者
基数排序过程及程序基数排序过程及程序基数排序过程及程序基数排序过程及程序
这边所要介绍的「基数排序法」(radix sort)则是属于「分配式排序」(distribution sort),基数排序法又称「桶子法」(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些「桶...
基数排序C语言实现
1.需求分析 ①.问题描述 给出一组数据,按照最低位优先的方法完成基数排序。多关键码排序按照从最主位关键码到最次位或从最次位到最主位关键码的顺序逐次排序。
基数排序算法 java实现 还有基数排序的原理文档
插入排序 冒泡排序 堆排序 基数排序 选择排序 快速排序的源码 java实现
排序算法很多,下面有基数排序,堆排序,希尔排序,直接插入排序的代码和思路
算法导论之基数排序,桶排序。基数排序是利用在各个位上进行计数排序,是一种线性排序
8646 基数排序 时间限制:1000MS 内存限制:1000K 提交次数:0 通过次数:0 题型: 编程题 语言: 无限制 描述 用函数实现基数排序,并输出每次分配收集后排序的结果 Input 第一行:键盘输入待排序关键的个数n 第二...
Radix Sort (基数排序)排序算法
基数排序算法,这是分不错的算法,实现起来有点难,用静态链表实现,每次改变结点的指向,希望有用,多多指教
网上的一些基数排序都是用链表的,写了个非链表的例子
排序算法中的基数排序,更重要的是会算时间复杂度,基数排序可以说是以计数排序位基础的,只不过变成了一位一位来或者一个字节一个字节来,每位或者每个字节都过了一遍,则排序完毕。很简单的程序,在code::block IDE...
常用排序效率PK 冒泡 快排 选择排序 基数排序 希尔排序 折半插入排序 等