队列-利用队列进行数字排序

【题目】

题目链接

【分析】

利用数据的绝对大小而不是相对大小进行排序,时间复杂度可能很高。普通的哈希方法可能因为数据稀疏导致效率低下,分位操作解决了这个问题!

具体实现过程中用stringstream规避了重复输出数据的麻烦 

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <sstream>
using namespace std;

int get_digit_number(int x, int i)
{
    int tmp = pow(10, i);
    x /= tmp;
    return x % 10;
}

int how_many_digits(int x)
{
    int ret = 1;
    while ((x /= 10) != 0)
        ++ret;
    return ret;
}

vector<int> q[5][10];

int main()
{
    int n;
    int max_digits = 0;
    cin >> n;
    for (int i = 0; i < n; ++i) {
        int t; cin >> t;
        max_digits = max(max_digits, how_many_digits(t));
        q[0][t % 10].push_back(t);
    }

    ostringstream sout;
    for (int i = 1; i <= max_digits; ++i) {
        printf("Step%d.\n", i);
        for (int j = 0; j < 10; ++j) {
            printf("Queue%d:", j);
            for (int e : q[i-1][j]) {
                printf("%d ", e);
                if (i == max_digits)
                    sout << e << " ";
                else
                    q[i][get_digit_number(e, i)].push_back(e);
            }
            printf("\n");
        }
    }
    cout << sout.str() << endl;
    system("pause");
    return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
顺序存储的线性表 时数 2 性质 验证 内容:1、设线性表存放在向量A[arrsize]的前elenum个分量中,且递增有序。试设计一算法,将x插入到线性表的适当位置上,以保持线性表的有序性。 2、用向量作存储结构,试设计一个算法,仅用一个辅助结点,实现将线性表中的结点循环右移k位的运算。 3、用向量作存储结构,试设计一个算法,仅用一个辅助结点,实现将线性表逆置的运算。 要求:了解线性表的逻辑结构特征,熟练掌握线性表的顺序存储结构的描述方法,及在其上实现各种基本运算的方法。 单链表上的操作 时数 2 性质 验证 内容:1、已知带头结点的动态单链表L中的结点是按整数值递增排序的,试写一算法将值为x的结点插入到表L中,使L仍然有序。 2、设计一算法,逆置带头结点的动态链表L。要求利用原表的结点空间,并要求用尽可能少的时间完成。 3、假设有两个按元素值递增有序的线性表A和B,均以单链表作存储结构,试编写算法将A表和B表归并成一个按元素值递减有序的线性表C,并要求利用原表的空间存放C。 要求:熟练掌握线性表的单链式链接存储结构及在其上实现线性表的各种基本运算的方法。 循环链表和双链表 时数 2 性质 验证 内容:1、假设在长度大于1的单循环链表中,既无头结点也无头指针。s为指向某个结点的指针,试编写算法删除结点*s的直接前驱结点。 2、已知由单链表表示的线性表中,含有三类字符的数据元素(如:字母、数字和其它字符),设计算法构造三个以循环链表示的线性表,使每一个表中只含同一类的字符,且利用原表中的结点空间作为这三个表的空间。(头结点可以另辟空间) 3、有一双链表,每个结点中除有prior、data和next域外,还有一访问频度域freq,在链表被启用前,其值均初始化为零。每当在链表上进行一次LOCATE(L,x)运算,元素值为x的结点中freq域的值增1,并使此链表中结点保持按freq递减的顺序排列,以便使频繁访问的结点总是靠近表头。设计满足上述要求的LOCATE算法。 要求:熟练掌握线性表的循环链式和双链式链接存储结构及在其上实现线性表的各种基本运算的方法。 栈和队列 时数 2 性质 验证 内容:1、设单链表中存放着n个字符,设计算法,判断该字符串中是否有中心对称关系。例如:xyzzyx、xyzyx都算是中心对称的字符串。 2、设计算法判断一个算术表达式的圆括号是否配对。(提示:对表达式进行扫描,遇‘(’进栈,遇‘)’退掉栈顶的‘(’,表达式被扫描完毕,栈为空) 3、假设以带头结点的循环链表表示队列,并只设一个指针指向队尾,编写相应的置队空、入队和出队算法。 要求:掌握栈和队列的数据结构的特点;熟练掌握在两种存储结构上实现栈和队列的基本运算;学会利用栈和队列解决一些实际问题。 串运算的实现 时数 2 性质 验证 内容:1、若X和Y是用结点大小为1的单链表表示的串,设计算法找出X中第一个不在Y中出现的字符。 2、设计一算法,在顺序串上实现串的比较运算strcmp(S,T)。 3、若S和T是用结点大小为1的单链表存储的两个串,设计算法将S中首次与T匹配的子串逆置。 要求:熟练掌握串的顺序和链接存储结构的实现方法;熟练掌握在两种存储结构上实现串的各种运算。 树的应用 时数 2 性质 验证 内容:1、以二叉链表作存储结构,设计求二叉树高度的算法。 2、一棵n个结点的完全二叉树用向量作存储结构,用非递归算法实现对该二叉树进行前序遍历。 3、以二叉链表作存储结构,编写非递归的前序、中序、后序遍历算法。 要求:熟悉二叉树的各种存储结构的特点及适用范围;掌握建立二叉树的存储结构的方法;熟练掌握二叉树的前序、中序、后序遍历的递归及非递归算法;灵活运用递归的遍历算法实现二叉树的其它各种运算。
AIC的学费很贵,半年18000元,大家看看他们教些什么内容吧他们学校的网址http://www.aicsws-sjtu.com/此内容是Java第1到第六章的PPT,希望大家喜欢如果大家觉得好我继续发课程定位“Java程序”课程覆盖SCJP认证所要求的知识点,是J2EE课程体系中的基础课程。本课程面向的学员应该具有基本的编程概念,能够编写简单的程序,并学习过操作系统,数据结构等计算机理论知识。课程选用最新的JDK5.0版本作为开发平台,教学的宗旨是:激发兴趣,理解知识,树立面向对象编程思维。  课程目标 认识Java平台,了解java application和applet的开发,激发学员对Java编程语言的兴趣。 学习和掌握Java变量,运算符,控制结构,数组,方法等基本语法。 培养和建立面向对象编程的思维方式,可以运用封装、继承和多态三大基本特性编写面向对象的程序。 理解和应用Java异常,常用类,IO,集合和多线程等开发技术。 课时安排 总学时:52学时 授课:48学时 (含约20学时实验) 考试:4学时 预备知识 了解和使用操作系统,计算机的基本组成,简单的程序开发技术 参考教材 “Java 程序设计教程” 第5 版 清华大学出版社 “SCJP学习指南” 人民邮电出版社 “Java 编程思想” 第3版 机械工业出版社 教学内容和要求知识点 重要程度 使用频度 难度Java 入门 高 中 易变量和运算符 高 高 中控制结构 高 高 易数组 高 高 中方法 很高 高 中封装 很高 很高 难继承 很高 很高 难多态 很高 高 很难内部类 高 中 难异常和断言 高 高 难常用类 高 很高 中基本数据结构 高 很高 难集合 很高 很高 难IO和串行化 高 中 难知识点 重要程度 使用频度 难度第1章 Java入门 4课时 了解Java程序开发环境,理解JVM的运作机制。 初步认识面向对象编程,Java视一切为对象。 使用输入和输出语句编写简单的Java应用程序。 区分applet与application(浏览器和虚拟机上运行)。 编写简单的applet,并嵌入HTML文档,掌握其运行方法。 掌握编程规范,如命名,缩进,空格,空行等。 使用javac, java, appletviewer等命令编译和运行application和applet。第2章 面向过程(变量和控制结构) 4课时 掌握变量的内存概念,8种基本类型,字面值和赋值。 正确使用各种Java运算符,如一元运算符,算术运算符,关系运算符,逻辑运算符,条件运算符和赋值运算符等。 辨别使用if,if…else,switch选择结构执行不同的动作。 辨别使用while,for,do…while循环结构执行不同的动作。 使用程序控制语句break和continue。 使用基本类型的包装器类,理解装箱和拆箱。 [*]了解Java内存机制:栈、堆、常量池等,理解垃圾回收机制。第3章 面向过程(数组和方法) 4课时 理解如何声明数组、构造数组、初始化数组以及使用数组中的各个元素。 清楚数组作为对象处理,创建数组对象时指定数组大小。 能够声明和操作多维数组。 掌握定义方法(声明方法)和调用方法,通过参数和返回值传递数据。 理解实际参数与形式参数以及参数类型的提升(隐式转型)。 掌握方法重载(overload)的基本要求。 区别和掌握按值传递与按引用传递。第4章 面向对象(封装) 4课时 理解类封装属性(数据成员)和行为(方法成员),区别类和对象。 能够定义类,创建类的对象(实例化类)和通过对象引用访问数据成员和方法成员;形成定义类和使用类的两种不同的思维方式。 理解构造函数的作用(分配对象空间),理解和定义重载的构造函数。 明白this引用的两种用法。 弄清对象类型与基本类型的区别。 掌握private, public访问控制符。 理解和使用关
1. 发现错误并改错。给出一个实现插入排序的程序,文件名为InsertionSort.java,该文件中有代码错误,请单步调试,发现错误, 并改正错误,提示:只有一行程序有错误,所以只能修改代码中的某一行程序。要求演示在eclipse开发环境下 单步调试程序,如果没有eclipse开发环境,也可以使用其它集成开发环境,但是必须演示调试能力。 2. 请编写程序输出13/17小数点后第100位的数字是几?考察循环和除法运算以及模运算(求余数运算)。 请补齐FractionalDigit.java文件中的代码 3. 请编写程序,分别使用循环和递归两种方法计算斐波那契数列第项是几? 斐波那契数列的第1项为1,第2项为1,后续任意项的值为其前两项的和。 请补齐Fibo.java文件中的代码 4. 实现Array类中的indexOf函数; 阅读Node.java和SingleLinkedList.java两个关于单链表的类, 实现SingleLinkedList类中的indexOf函数; 5. 阅读Node.java和SingleLinkedList.java类,利用它们来实现栈和双向队列功能,请阅读Stack.java 和Deque.java(双向队列),请实现Stack类中的pop函数,请实现Deque.java中的removeLast函数。 6. 利用前面的Stack.java和Deque.java类,实现下面问题的求解: 队列中有从1到7(由小到大排列)的7个整数,问经过一个整数栈后,出栈的所有排列数有多少? 如果整数栈的容量是4(栈最多能容纳4个整数),那么出栈的排列数又是多少?(百度查询 卡特兰数) 请补齐Catalan.java文件中的代码 7. 八皇后问题。在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、 同一列或同一斜线上,问有多少种摆法。该程序代码在EightQueens.java文件中,请将void place(int n)函数 中未完成的代码补齐,并写出运行结果。 禁止修改其他代码。 8. 学生排序。给出4名同学,请按照学生的年龄排序,然后输出学生的学号和姓名。具体代码见Student.java文件, 请实现sort函数。并运行该程序。 9. 二叉排序树检索。BstNode.java和BinarySortTree.java是关于二叉排序树的程序文件,请阅读这两个程序 文件,请实现contains函数,并运行该程序。 10. BASE64编码转换问题。请百度百科查询base64编码,实现将二进制字节数据编码转换为base64的字符串数据,以及 将base64字符串转换回二进制字节数据。禁止使用JDK自带的Base64转换程序以及Apache开源网站上的程序, 必须自己编写代码来实现BASE64编码和解码函数。可以为该类添加其他数据成员和函数成员。
在C++中,我们可以利用队列实现链式基数排序。这里介绍一个利用STL中的队列实现链式基数排序的方法。 ```cpp #include <iostream> #include <queue> #include <cmath> using namespace std; // 获取一个数字的某一位数字 int getDigit(int number, int digit) { return (number / static_cast<int>(pow(10, digit - 1))) % 10; } // 链式基数排序 void radixSort(int arr[], int size, int digit) { // 创建 10 个桶 queue<int> bucket[10]; // 按照每一位数字进行排序 for (int i = 1; i <= digit; i++) { // 把数据放入桶中 for (int j = 0; j < size; j++) { int num = getDigit(arr[j], i); bucket[num].push(arr[j]); } // 把桶中的数据放回原数组中 int index = 0; for (int j = 0; j < 10; j++) { while (!bucket[j].empty()) { arr[index++] = bucket[j].front(); bucket[j].pop(); } } } } int main() { int arr[] = {170, 45, 75, 90, 802, 24, 2, 66}; int size = sizeof(arr) / sizeof(arr[0]); radixSort(arr, size, 3); for (int i = 0; i < size; i++) { cout << arr[i] << " "; } cout << endl; return 0; } ``` 在代码中,我们首先定义了一个 `getDigit` 函数,用于获取一个数字的某一位数字。然后定义了 `radixSort` 函数,用于进行链式基数排序。在函数中,我们首先创建了 10 个桶,然后按照每一位数字进行排序,具体实现方法是把数据放入相应的桶中,然后把桶中的数据放回原数组中。最后,在 `main` 函数中,我们创建了一个数组 `arr`,并调用 `radixSort` 函数进行排序。最后输出排序后的结果。 需要注意的是,这里我们只引入了队列的库,而没有引入链表等其他库,因为队列是链表的一种特殊形式,可以用来实现链式存储。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值