本人小白,大佬勿喷,发表一些日常学习的记录,简单来说基数排序是基于桶排序的多关键字排序。这里的关键字指的是数据每位上数字的大小。下面直接展示代码
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
typedef struct list {
int data;
list* next;
}list;
list* creatlist()//创建单向链表,且头指针不含有数据
{
list* pl;
pl = (list*)malloc(sizeof(list));
if (!pl) exit(1);
pl->next = NULL;
return pl;
}
void tailinsert(list* head , int data)//尾插法,其实这里用头插法效率要高一点,但是尾插法好理解
{
list* ph, * temp;
temp = head;
ph = (list*)malloc(sizeof(list));
if (!ph) exit(1);
ph->next = NULL;
ph->data = data;
while (temp->next != NULL)
{
temp = temp->next;
}
temp->next = ph;
}
int select_max(int a[])//找到数组中最大的一个数
{
int max, j;
max = a[0];
for (j = 1; j < 10; j++)
{
if (a[j] > max)
{
max = a[j];
}
}
return max;
}
void clear_list(list *lp)//清空链表上的数据
{
list* mp, * hp;
hp = lp->next;
while (hp != NULL)
{
mp = hp->next;
free(hp);
hp = mp;
}
lp->next = NULL;
}
void radix_sort(int a[])//基数排序函数
{
int it = 0, temp, kp;
list* litmp[10] = {};//创建一个结构体指针数组
for (int k = 0; k < 10; k++)
{
litmp[k] = creatlist();
}//创建邻接表
kp = select_max(a);
while ((int)pow(10, it) <= kp)
{
list* lp;
lp = litmp[0];
int i = 0;
for (i; i < 10; i++)
{
temp = a[i] / (int)pow(10, it) % 10;
tailinsert(litmp[temp], a[i]);
}//让数组数据入桶
for (int m = 0,h = 0; m < 10;)
{
if (lp->next != NULL)
{
a[h++] = lp->next->data;
lp = lp->next;
}
else
{
m++;
lp = litmp[m];
}
}//让数组数据出桶
for (int f = 0; f < 10; f++)
{
clear_list(litmp[f]);
}//清桶,为下一次入桶做准备
it++;
}
}
int main()
{
int a[] = { 2,3,42,12,154,123,2,4,2,10 };
radix_sort(a);
print(a);
}
基数排序的时间复杂度取决于数组中最大元素的位数,在最大元素比较小的时候,效率高于快速排序。