Wed May 3 13:59:00 UTC 2023 inscode

上级 df352508
print('欢迎来到 InsCode')
\ No newline at end of file
#定义静态链表的结构体
struct Node {
int data; //数据
int next; //指向下一个结点的指针
bool isEnd; //标记该结点是否是一个数的末位结点
} list[N];
#获取num从右往左第i位上的数字
int getDigit(int num, int i) {
while (i--) {
num /= 10;
}
return num % 10;
}
void radixSort() {
int n = 0; //存储静态链表中结点的数量
int p = maxn - 1; //指向静态链表头部
while (p != -1) {
list[p].isEnd = true; //标记该结点是一个数的末位结点
n++;
p = list[p].next;
}
for (int i = 0; i < d; i++) { //从低位到高位依次对每一位进行排序
int head[maxn], tail[maxn]; //辅助数组存储每个桶的头指针和尾指针
for (int j = 0; j < 10; j++) { //初始化辅助数组
head[j] = tail[j] = -1;
}
int k = maxn - 1; //指向静态链表头部
while (k != -1) { //将所有数按照第i位上的数字分配到不同的桶中
int digit = getDigit(list[k].data, i);
if (head[digit] == -1) {
head[digit] = k;
} else {
list[tail[digit]].next = k;
}
tail[digit] = k;
k = list[k].next;
}
int last = -1; //存储上一个桶的尾指针
bool flag = false; //标识是否完成排序
for (int j = 0; j < 10; j++) { //遍历每个桶
if (head[j] == -1) { //如果桶为空直接跳过
continue;
}
if (flag && j > 0) { //如果已经完成排序且当前桶的下标大于0则退出循环
break;
}
if (last != -1) { //将上一个桶的尾指针指向当前桶的头指针
list[last].next = head[j];
}
last = tail[j]; //更新last
if (!flag && j == 9 && list[tail[j]].isEnd) { //如果当前已经排序到最高位且最后一个数是最大数则标识已完成排序
flag = true;
}
}
list[last].next = -1; //将最后一个桶的尾指针指向-1表示排序结束
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册