1-1
对N个记录进行归并排序,归并趟数的数量级是O(NlogN)。
F
N2
仅基于比较的算法能得到的最好的“最坏时间复杂度”是O(NlogN)。
T
分数 5
作者 DS课程组
单位 浙江大学
对N个记录进行归并排序,空间复杂度为:
A.O(logN)
B.O(N)
C.O(NlogN)
D.O(N2)
分数 5
作者 考研真题
单位 浙江大学
使用二路归并排序对含 n 个元素的数组 M 进行排序时,二路归并操作的功能是:
A.将两个有序表合并为一个新的有序表
B.将 M 划分为两部分,两部分的元素个数大致相等
C.将 M 划分为 n 个部分,每个部分中仅含有一个元素
D.将 M 划分为两部分,一部分元素的值均小于另一部分元素的值
分数 5
作者 DS课程组
单位 浙江大学
下列排序算法中,哪种算法可能出现:在最后一趟开始之前,所有的元素都不在其最终的位置上?(设待排元素个数N>2)
A.冒泡排序
B.插入排序
C.堆排序
D.快速排序
分数 5
作者 DS课程组
单位 浙江大学
在基于比较的排序算法中,哪种算法的最坏情况下的时间复杂度不高于O(NlogN)?
A.冒泡排序
B.归并排序
C.希尔排序
D.快速排序
排序方法中,从未排序序列中依次取出元素与已排序序列中的元素进行比较,将其放入已排序序列的正确位置的方法称为:
A.插入排序
B.选择排序
C.快速排序
D.归并排序
输入106个只有一位数字的整数,可以用O(N)复杂度将其排序的算法是:
A.快速排序
B.桶排序
C.插入排序
D.希尔排序
将序列{ 2, 12, 16, 88, 5, 10, 34 }排序。若前2趟排序的结果如下:
- 第1趟排序后:2, 12, 16, 10, 5, 34, 88
- 第2趟排序后:2, 5, 10, 12, 16, 34, 88
则可能的排序算法是:
A.冒泡排序
B.归并排序
C.快速排序
D.插入排序
在内部排序时,若选择了归并排序而没有选择插入排序,则可能的理由是:
- 归并排序的程序代码更短
- 归并排序占用的空间更少
- 归并排序的运行效率更高
A.仅 2
B.仅 3
C.仅 1、2
D.仅 1、3
分数 5
作者 考研试卷
单位 浙江大学
下列排序方法中,若将顺序存储更换为链式存储,则算法的时间效率会降低的是:
1.插入排序;2.选择排序;3.起泡排序;4.希尔排序;5.堆排序
A.仅1、2
B.仅2、3
C.仅3、4
D.仅4、5
选择一个排序算法时,除算法的时空效率外,下列因素中,还需要考虑的是:
- I、数据的规模
- II、数据的存储方式
- III、算法的稳定性
- IV、数据的初始状态
A.仅 III
B.仅 I、II
C.仅 II、III、IV
D.I、II、III、IV
排序方法的稳定性
下列排序算法中,▁▁▁▁▁ 是不稳定的。
A.简单选择排序
B.直接插入排序
C.归并排序
D.基数排序
对数据进行排序时,若采用直接插入排序而不采用快速排序,则可能的原因是
I. 大部分元素已有序
II. 待排序元素数量很少
III. 要求空间复杂度为O(1)
IV. 要求排序算法是稳定的
A.仅 I、II
B.仅 III、IV
C.仅 I、II、IV
D.I、II、III、IV
给出关键字序列{ 4321, 56, 57, 46, 289, 17, 331, 33, 234, 63 },下面哪个选择是按次位优先(LSD)链式基数排序进行了一趟分配和收集的结果?
A.→4321→331→33→63→234→56→46→57→17→289
B.→331→4321→33→63→234→56→46→57→17→289
C.→56→289→4321→331→33→234→46→57→63→17
D.→57→46→289→17→33→234→63→56→4321→331
设数组 S[ ]={93, 946, 372, 9, 146, 151, 301, 485, 236, 327, 43, 892},采用最低位优先(LSD)基数排序将 S 排列成升序序列。第 1 趟分配、收集后,元素 372 之前、之后紧邻的元素分别是:
A.43,892
B.236,301
C.301,892
D.485,301
7-1 PAT排名汇总
计算机程序设计能力考试(Programming Ability Test,简称PAT)旨在通过统一组织的在线考试及自动评测方法客观地评判考生的算法设计与程序设计实现能力,科学的评价计算机程序设计人才,为企业选拔人才提供参考标准(网址http://www.patest.cn)。
每次考试会在若干个不同的考点同时举行,每个考点用局域网,产生本考点的成绩。考试结束后,各个考点的成绩将即刻汇总成一张总的排名表。
现在就请你写一个程序自动归并各个考点的成绩并生成总排名表。
输入格式:
输入的第一行给出一个正整数N(≤100),代表考点总数。随后给出N个考点的成绩,格式为:首先一行给出正整数K(≤300),代表该考点的考生总数;随后K行,每行给出1个考生的信息,包括考号(由13位整数字组成)和得分(为[0,100]区间内的整数),中间用空格分隔。
输出格式:
首先在第一行里输出考生总数。随后输出汇总的排名表,每个考生的信息占一行,顺序为:考号、最终排名、考点编号、在该考点的排名。其中考点按输入给出的顺序从1到N编号。考生的输出须按最终排名的非递减顺序输出,获得相同分数的考生应有相同名次,并按考号的递增顺序输出。
输入样例:
2
5
1234567890001 95
1234567890005 100
1234567890003 95
1234567890002 77
1234567890004 85
4
1234567890013 65
1234567890011 25
1234567890014 100
1234567890012 85
输出样例:
9
1234567890005 1 1 1
1234567890014 1 2 1
1234567890001 3 1 2
1234567890003 3 1 2
1234567890004 5 1 4
1234567890012 5 2 2
1234567890002 7 1 5
1234567890013 8 2 3
1234567890011 9 2 4
#include<bits/stdc++.h>
using namespace std;
struct student {
string s;
int score;
int id;
int rank;
int zrank;
}a[30000];
bool cmp(student x,student y)
{
if(x.score != y.score)
return x.score>y.score;
else//成绩相等优先输出编号小的
return x.s<y.s;
}
int main() {
int n, cnt= 0,k;
cin>>n;
for(int i = 0; i < n; i++)
{
cin>>k;
for(int j = 0; j < k; j++)
{
cin>>a[j+cnt].s>>a[j+cnt].score;//考号成绩
a[j+cnt].id=i+1;//考场编号
}
sort(a+cnt,a+cnt+k,cmp);
a[cnt].rank = 1;
for(int j = 1; j < k; j++)
{
if(a[cnt+j-1].score == a[cnt+j].score)
a[cnt+j].rank = a[cnt+j-1].rank;
else
a[cnt+j].rank = j+1;
}
cnt = cnt + k;
}
sort(a,a+cnt,cmp);
a[0].zrank = 1;
for(int j = 1; j < cnt; j++)
{
if(a[j-1].score == a[j].score)
a[j].zrank = a[j-1].zrank;
else
a[j].zrank = j+1;
}
cout<<cnt<<endl;
for(int i = 0; i < cnt; i++)
cout<<a[i].s<<" "<<a[i].zrank<<" "<<a[i].id<<" "<<a[i].rank<<endl;
return 0;
}