栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

7-1 链式基数排序 (20 分)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

7-1 链式基数排序 (20 分)

7-1 链式基数排序 (20 分)

实现链式基数排序,待排序关键字n满足1≤n≤1000,最大关键字数位≤5。

输入样例:

第一行输入待排序个数n(1≤n≤1000),再输入n个数(n的数位≤5)。

10
278 109 63 930 589 184 505 269 8 83
输出样例:

输出每趟分配-收集后链表中的关键字,趟数为序列中最大值的数位(如样例中930的数位为3),每行结尾有空格。

930 63 83 184 505 278 8 109 589 269 
505 8 109 930 63 269 278 83 184 589 
8 63 83 109 184 269 278 505 589 930 
AC代码(g++)
#include 
#include 
#include 
using namespace std;

struct node{
    int number;
    struct node * next;
};

int num, maxN = 1;
node *head;
queue q[10];

void init() {
    cin >> num;
    head = (node*) malloc(sizeof(node));
    head->next = nullptr;
    node *temp, *p = head;
    for (int i = 0; i < num; ++i) {
        temp = (node*) malloc(sizeof(node));
        p->next = temp;
        temp->next = nullptr;
        p = temp;
        cin >> temp->number;
        while (temp->number >= maxN) maxN *= 10;
    }
}
void printOut() {
    node *p = head->next;
    while (p != nullptr) {
        cout << p->number << ' ';
        p = p->next;
    }
    cout << endl;
}
void CS() {
    for (auto &i: q)
        while (!i.empty()) i.pop();
    node *p;
    for (int position = 1; position < maxN; position *= 10) {
        p = head->next;
        while (p != nullptr) {
            q[p->number / position % 10].push(p);
            p = p->next;
        }
        p = head;
        for (auto & i : q)
            while (!i.empty()) {
                p->next = i.front();
                p = p->next;
                p->next = nullptr;
                i.pop();
            }
        printOut();
    }
}
int main() {
    init();
    CS();
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/604652.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号