数据结构题目-排序

目录

问题 A: 大顶堆还是小顶堆?

问题 B: sort by age

问题 C: 统计字母个数

问题 D: 字母排序

问题 E: 算法10-6~10-8:快速排序


问题 A: 大顶堆还是小顶堆?

内存限制:128 MB时间限制:1.000 S标准输入输出

题目类型:传统评测方式:文本比较

题目描述

一个CPU处理的任务队列,并不总是按照时间顺序处理,有些任务有着更高的优先级。比如:一个任务需要对核反应堆进行调度,另一个任务是打印一个文档。
针对这种需要处理优先级的任务选择执行场景,需要设计一种数据结构,高效率实现以下两种操作,从集合中定位并删除最大值(执行任务),在集合中插入新元素(新增任务)。堆就是这样一种数据结构。

堆是一种完全二叉树:0号节点为根结点,i号的左子为2*i+1,右子为2*i+2。按照内部元素的大小关系,堆可以分为大顶堆和小顶堆两种。
大顶堆(降序堆):每个结点的值都大于或等于其左右孩子结点的值
小顶堆(升序堆):每个结点的值都小于或等于其左右孩子结点的值
可以用数组去实现堆的存储。
本题给出用数组实现的堆包含的所有元素,请判断其是大顶堆,小顶堆,或者不是堆呢?

输入格式

输入第一行为大于等于2且小于100的一个正整数n,代表数组中元素个数
第二行为空格分割的n个正整数,代表数组中的每个元素

输出格式

输出包括一行
如果是大顶堆,输出Big Heap
如果是小顶堆,输出Small Heap
如果不满足堆堆条件,输出Not Heap

输入样例 复制

6
5 16 30 33 15  38

输出样例 复制

Not Heap
#include<bits/stdc++.h>
using namespace std;
int a[1005];
 
int main()
{
    int n;
    cin>>n;
    queue<int>q;
    for(int i=0;i<n;i++)
        cin>>a[i];
    q.push(a[0]);
    int da=0;
    int xiao=0;
    int no=0;
    for(int i=1;i<n;i++)
    {
        q.push(a[i]);
        if(i+1==n)
            q.push(q.front());
        q.push(a[i+1]);
        if(q.front()>=a[i]&&q.front()>=a[i+1])
            da=1;
        else if(q.front()<=a[i]&&q.front()<=a[i+1])
            xiao=1;
        else
            no=1;
        q.pop();
        i++;
    }
    if(no)
    {
        cout<<"Not Heap"<<endl;
        return 0;
    }
    if(da&&!xiao)
    {
        cout<<"Big Heap"<<endl;
        return 0;
    }
    if(!da&&xiao)
    {
        cout<<"Small Heap"<<endl;
        return 0;
    }
    if(da&&xiao)
    {
        cout<<"Not Heap"<<endl;
        return 0;
    }
}

问题 B: sort by age

内存限制:256 MB时间限制:1.000 S标准输入输出

题目类型:传统评测方式:文本比较

提交:4843通过:1653

题目描述

You are given the ages (in years) of all people of a country with at least 1 year of age. You know that no individual in that country lives for 101 or more years. Now, you are given a very simple task of sorting all the ages in ascending order.

输入格式

There are multiple test cases in the input file. Each case starts with an integer (0<n<=2000000), the total number of people. In the next line, there are integers indicating the ages. Input is terminated with a case where = 0. This case should not be processed.

输出格式

For each case, print a line with space separated integers. These integers are the ages of that country sorted in ascending order.

输入样例 复制

5
2 1 4 3 6
3
2 1 3
0

输出样例 复制

1 2 3 4 6
1 2 3
#include<bits/stdc++.h>
using namespace std;
 
 
int main()
{
    int n;
    while(cin>>n)
    {
        int a[105]={0};
        if(n==0)
            return 0;
        int index;
        for(int i=0;i<n;i++)
        {
            cin>>index;
            a[index]++;
        }
        for(int i=1;i<101;i++)
        {
            if(a[i]!=0)
            {
                for(int j=0;j<a[i];j++)
                    cout<<i<<" ";
            }
        }
        cout<<endl;
    }
}

问题 C: 统计字母个数

内存限制:128 MB时间限制:1.000 S标准输入输出

题目类型:传统评测方式:文本比较

提交:2455通过:1262

题目描述

给定一段文章,请输出每个小写字母出现的次数

输入格式

只有一组输入数据,该数据大小<10KB。文章中包含大小写字母、空格和换行符、标点,数字,其他符号等,以’#’结尾。

输出格式

输出格式为“C A”,C为’a’..’z’中的字母,A为出现次数,C和A之间空一格
注意只统计小写字母的数量,忽略其他字符。

输入样例 复制

here is the input
this is the article#

输出样例 复制

a 1
b 0
c 1
d 0
e 5
f 0
g 0
h 4
i 5
j 0
k 0
l 1
m 0
n 1
o 0
p 1
q 0
r 2
s 3
t 5
u 1
v 0
w 0
x 0
y 0
z 0
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
 
ll a[30];
int main()
{
    char c;
    while(cin>>c)
    {
        if(c=='#')
            break;
        if(c>='a'&&c<='z')
            a[int(c)-97]++;
    }
    for(int i=0;i<26;i++)
        cout<<char(i+97)<<" "<<a[i]<<endl;
}

问题 D: 字母排序

内存限制:128 MB时间限制:2.000 S标准输入输出

题目类型:传统评测方式:文本比较

提交:2116通过:982

题目描述

有一天,老师给小明一个字符串,要求小明把这个字符串从小到大排序,但是小明太懒了,你能帮帮他吗?

输入格式

第一行输入一个整数T,共有T组测试数据(T<=100)。
每组输入数据占一行,为一个仅包含小写字母的字符串(长度<=100000)。
 

输出格式

输出有T行,每行包括一个排好序的字符串

输入样例 复制

2
abc
acb

输出样例 复制

abc
abc
#include<bits/stdc++.h>
using namespace std;
 
 
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        string s;
        int a[30]={0};
        cin>>s;
        int n=s.length();
        for(int i=0;i<n;i++)
            a[int(s[i])-97]++;
        for(int i=0;i<26;i++)
        {
            if(a[i]!=0)
            {
                for(int j=0;j<a[i];j++)
                    cout<<char(i+97);
            }
        }
        cout<<endl;
    }
}

问题 E: 算法10-6~10-8:快速排序

内存限制:128 MB时间限制:1.000 S标准输入输出

题目类型:传统评测方式:文本比较

提交:3181通过:1676

提交

提交C++答案 (提交main.cpp文件)

返回比赛提交记录

题目描述

快速排序是对起泡排序的一种改进。它的基本思想是,通过一趟排序将待排序的记录分割成两个独立的部分,其中一部分记录的关键字均比另一部分的关键字小,在分成两个部分之后则可以分别对这两个部分继续进行排序,从而使整个序列有序。

快速排序的算法可以描述如下:

在本题中,读入一串整数,将其使用以上描述的快速排序的方法从小到大排序,并输出。

输入格式

输入的第一行包含1个正整数n,表示共有n个整数需要参与排序。其中n不超过100000。 第二行包含n个用空格隔开的正整数,表示n个需要排序的整数。

输出格式

只有1行,包含n个整数,表示从小到大排序完毕的所有整数。 请在每个整数后输出一个空格,并请注意行尾输出换行。

输入样例 复制

10
2 8 4 6 1 10 7 3 5 9

输出样例 复制

1 2 3 4 5 6 7 8 9 10 

数据范围与提示

*** 提示已隐藏,点击此处可显示 ***

收起提示[-]

在本题中,需要按照题目描述中的算法完成快速排序的算法。 快速排序是一种十分常用的排序算法,其平均时间复杂度为O(knlnn),其中n为待排序序列中记录的个数,k为常数。大量的实际应用证明,在所有同数量级的此类排序算法中,快速排序的常数因子k是最小的,因此,就平均时间而言,快速排序是目前被认为最好的一种内部排序方法。 而在C语言的常用编译器中,qsort函数是一个非常常用的快速排序函数。

#include<bits/stdc++.h>
using namespace std;
int a[100005];
 
void qs(int l,int r)
{
    if(l<r)
    {
        int i,j,x;
        i=l,j=r,x=a[i];
        while(i<j)
        {
            while(i<j&&a[j]>x)
                j--;
            if(i<j)
                a[i++]=a[j];
            while(i<j&&a[i]<x)
                i++;
            if(i<j)
                a[j--]=a[i];
        }
        a[i]=x;
        qs(l,i-1);
        qs(i+1,r);
    }
}
 
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>a[i];
    qs(0,n-1);
    for(int i=0;i<n;i++)
        cout<<a[i]<<" ";
    cout<<endl;
    return 0;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嗯嗯你说的对

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值