C++按链式基数排序的方法实现对整数表的排序,用数组模拟链表,即不用结构体或类来写
时间: 2024-03-15 09:43:10 浏览: 18
好的,我可以给您提供一个用数组模拟链表的链式基数排序的代码示例:
```c++
#include <iostream>
#include <cstring>
using namespace std;
const int maxn = 100005;
const int maxd = 10;
int head[maxd], tail[maxd], val[maxn], next[maxn];
int n, cnt;
void radix_sort() {
for (int i = 0; i < maxd; i++) {
head[i] = tail[i] = -1;
}
for (int i = 1; i <= n; i++) {
cin >> val[i];
next[i] = -1;
int d = val[i] % 10;
if (head[d] == -1) {
head[d] = tail[d] = i;
} else {
next[tail[d]] = i;
tail[d] = i;
}
}
int now = 0;
for (int d = 0; d < maxd; d++) {
if (head[d] == -1) {
continue;
}
int p = head[d];
while (p != -1) {
val[++now] = val[p];
p = next[p];
}
head[d] = tail[d] = -1;
}
for (int k = 10; k <= 1000000000; k *= 10) {
for (int i = 1; i <= n; i++) {
int d = (val[i] / k) % 10;
if (head[d] == -1) {
head[d] = tail[d] = i;
} else {
next[tail[d]] = i;
tail[d] = i;
}
}
int now = 0;
for (int d = 0; d < maxd; d++) {
if (head[d] == -1) {
continue;
}
int p = head[d];
while (p != -1) {
val[++now] = val[p];
p = next[p];
}
head[d] = tail[d] = -1;
}
}
for (int i = 1; i <= n; i++) {
cout << val[i] << " ";
}
}
int main() {
cin >> n;
radix_sort();
return 0;
}
```
在这个实现中,我们用数组来存储元素值和链表结构,其中 `val` 数组存储元素值,`next` 数组存储链表中每个元素的下一个元素的下标。链表的头节点和尾节点分别存储在 `head` 和 `tail` 数组中。
在排序时,我们首先按照个位数进行排序,然后依次按照十位、百位等进行排序,直到排完所有的位数。在排序每一位时,我们需要重新构造一个链表,将元素按照该位上的数字插入到对应的链表中,然后按照链表的顺序重新排列元素。