一道面试题(关于千万量级数据结构排序)

问题描述

一道面试题(关于千万量级数据结构排序)

题目:
已知文件中存有全国英语六级历年来的成绩(千万级别,考生分数都是正整数,最高710分),每一行都是一个人的姓名、考号和成绩,请你对考生的成绩从高到低进行排序,输出到另一个文件中。
格式 如下:
李四,201008823,678;
张三,201007432,356;
王五,201322233,464;
排序后:
李四,201008823,678;
王五,201322233,464;
王五,201322233,464;
要求:使空间复杂度和时间复杂度尽可能低,希望可以达到时间复杂度为O(n)。按目前数据量预计计算机内存足够。可以用伪代码或说明思路
刚注册,没有分可悬赏,但应该是个不错的题。。

    以下是我的思路,但是不能完全解答出来,请高手提提建议:
    1.首先这个排序的依据是分数,而英语四级考试分数有范围0-710分。题目希望时间复杂度尽可能低。排除依据比较的排序算法如快速排序、选择排序,应该选择线性排序算法。
    2.再因为是千万级的数据,可以考虑使用桶排序,建立一个有711大小的桶(数组),遍历整个文档,根据分数大小在相应的桶号上计数。
    3.根据上面两步,基本是可以实现单纯的成绩排序。而且时间复杂度为O(n),空间复杂度也就是多一个桶数组。
    4.困难:问题是,基于计数的桶排序的对象如果是纯数字,好说。但是题目是带有姓名、考号和成绩三个属性的对象。怎么利用桶排序呢?

    谢谢!

解决方案

刚注册,没有分可悬赏,这个不是问题!可以充值的,充了就有悬赏的C币,不是分!

解决方案二:

文件读写么,定义一个类型为struct的vestor容器,你把数据读到struct里面,然后把成绩取出来不就完了

解决方案三:

其实这道题是单希望使用单循环即O(n),这个关键字在于分数,其实就是按分数做个最优的排序,是否不用想得太深呢?
只要想的是怎么实现单循环排序。

解决方案四:

对于排序,并不一定要使用基本类型。
#基于C++
首先要理解排序算法模型:它是通过数据和排序函数进行排序的。应该可以自定义Student类,然后在类中重载比较函数,把比较函数作为排序函数传给排序控制器。因为比较函数并不复杂,可以做成内联函数,避免递归调用。
因为只是对成绩排名,不需要再对学号排名,而且成绩范围确定[0-710],所以桶排序应该没问题。

解决方案五:

数据结构存储是让姓名与学号关联,学号与成绩关联,只对学号与成绩那组进行排序,时间复杂度中空间复杂度好。
struct std1
{
char name[10];
int number[10];
};
struct std2
{
int chengji;
int number[10];
}
对第二个进行排序,可以吗?

时间: 2024-10-30 19:12:56

一道面试题(关于千万量级数据结构排序)的相关文章

语言 面试题-一道面试题,不是很清楚这个例子怎么解答,求大神帮助.

问题描述 一道面试题,不是很清楚这个例子怎么解答,求大神帮助. 提问是 这段代码有什么问题, 有什么解决思路.(我其实连问题都没看出来,代码可以编译) // Memory-mapped peripheral#define STATUS_REG_ADDR 0x12345678 // 32-bit status register#define DATA_REG_ADDR 0x1234567C // 32-bit data register // Status register bits#define

初始化顺序-今年阿里巴巴的一道笔试题

问题描述 今年阿里巴巴的一道笔试题 public class Test1 { public static int k = 0; public static Test1 t1 = new Test1("t1"); public static Test1 t2 = new Test1("t2"); public static int i = print("i"); public static int n = 99; public int j = pr

结构体定义-如何定义满足以下的Node与List结构体,今天参加斐讯的一道笔试题。

问题描述 如何定义满足以下的Node与List结构体,今天参加斐讯的一道笔试题. Node包含50个字符.

从一道面试题说去

    有一道面试题: 给定n个整型数,怎样让这n个数的使用空间最小.      ok,我们都知道在32位的机器下,int类型的数占4个字节,因此n个数总的使用空间应该是4n.(64位不做解释)那我们怎么样才能使得n个数字的使用空间最小呢?     一. 我们先来看一个例子           假设现在有3个数,1,2,3.           我们都知道数字最后都是以二进制的方式存储的,我们可以表示出1,2,3的二进制           1: 0000 0000 0000 0000 0000

《Wireshark网络分析就这么简单》—从一道面试题开始说起

从一道面试题开始说起Wireshark网络分析就这么简单从一道面试题开始说起我每次当面试官,都要伪装成无所不知的大牛. 这当然是无奈的选择--现在每封简历都那么耀眼,不装一下简直镇不住场面.比如尚未毕业的本科生,早就拿下CCIE认证:留欧两年的海归,已然精通英.法.德三门外语:最厉害的一位应聘者,研究生阶段就在国际上首次提出了计算机和生物学的跨界理论--可怜我这个老实人在一开场还能装装,到了技术环节就忍不住提问基础知识,一下子把气氛从学术殿堂拉到建筑工地.不过就是这些最基础的问题,却常常把简历精

《大咖讲Wireshark网络分析》—从一道面试题开始说起

从一道面试题开始说起大咖讲Wireshark网络分析我每次当面试官,都要伪装成无所不知的大牛. 这当然是无奈的选择--现在每封简历都那么耀眼,不装一下简直镇不住场面.比如尚未毕业的本科生,早就拿下CCIE认证:留欧两年的海归,已然精通英.法.德三门外语:最厉害的一位应聘者,研究生阶段就在国际上首次提出了计算机和生物学的跨界理论--可怜我这个老实人在一开场还能装装,到了技术环节就忍不住提问基础知识,一下子把气氛从学术殿堂拉到建筑工地.不过就是这些最基础的问题,却常常把简历精英们难住.本文要介绍的便

一道面试题:布尔变量

FROM:酷壳 下面这篇文章是从StackOverflow来的.LZ面试的时候遇到了一道面试题:"如果有三个Bool型变量,请写出一程序得知其中有2个以上变量的值是true",于是LZ做了下面的这样的程序: boolean atLeastTwo(boolean a, boolean b, boolean c) { if ((a && b) || (b && c) || (a && c)) { return true; } else { r

mysql一道面试题

mysql> #一道面试题 mysql> #把一张表num 的值[20-30]之间的数全改为20 mysql> #并且把[30-40]之间的数全改为30 mysql> create table mianshi ( -> num int -> ); Query OK, 0 rows affected (1.94 sec) mysql> show tables; +----------------+ | Tables_in_test | +--------------

千万量级生活服务商家集体加冕网商

中介交易 SEO诊断 淘宝客 云主机 技术大厅 阿里巴巴网商大会拉开帷幕,其中生活服务网商尤其引人瞩目,跟直接从事B2C和C2C商品交易的网商不同,生活服务网商主要是以是生活消费领域的诸多商家,比如餐馆.等吃住玩领域的生活服务商家,通过如口碑网生活搜索类平台展现到用户面前,以满足用户生活消费需求为主的. 与农业和工业不同,服务业是随着社会的发展而不断发展并且逐步成为人们生产生活的重要组成部分,中国人对吃住玩的关注永远放在生活需求的首位,而全球经济一体化也给市场带来了协同的作用,原先往往一家公司包