当前位置: 首页 > news >正文

排序模板——C++

 0.排序模板题目

题目描述

将读入的 N 个数从小到大排序后输出。

输入格式

第一行为一个正整数 N。

第二行包含 N 个空格隔开的正整数 ai​,为你需要进行排序的数。

输出格式

将给定的 N 个数从小到大输出,数之间空格隔开,行末换行且无空格。

输入输出样例

输入 

5
4 2 4 5 1

输出

1 2 4 4 5

说明/提示

对于 20% 的数据,有 1≤N≤1e+3;

对于 100% 的数据,有 1≤N≤1e+5,1≤ai​≤1e+9。


 

1.快速排序

//快速排序
#include<iostream>
#include<cstdio>

using namespace std;

const int N = 100000;
int q[N];
int n;

void Quick_sort(int q[], int l, int r)
{
    if (l >= r) return;

    int x = q[(l + r) / 2], i = l - 1, j = r + 1;
    while (i < j)
    {
        do i++; while (q[i] < x);
        do j--; while (q[j] > x);
        if (i < j) swap(q[i], q[j]);
    }

    Quick_sort(q, l, j);
    Quick_sort(q, j + 1, r);
}

int main()
{
    scanf("%d", &n);
    for (int i = 0; i < n; i++) scanf("%d", &q[i]);

    Quick_sort(q, 0, n - 1);

    for (int i = 0; i < n; i++) printf("%d ", q[i]);
    return 0;
}

 

2.归并排序

//归并排序
#include<iostream>
#include<cstdio>

using namespace std;

const int N = 100000;
int q[N], tmp[N];
int n;

void Merge_sort(int q[], int l, int r)
{
    if (l >= r) return;

    int mid = (l + r) / 2;

    Merge_sort(q, l, mid);
    Merge_sort(q, mid + 1, r);

    int k = 0, i = l, j = mid + 1;
    while (i <= mid && j <= r)
    {
        if (q[i] <= q[j]) tmp[k++] = q[i++];
        else tmp[k++] = q[j++];
    }
    while (i <= mid) tmp[k++] = q[i++];
    while (j <= r) tmp[k++] = q[j++];

    for (i = l, j = 0; i <= r; i++, j++) q[i] = tmp[j];
}

int main()
{
    scanf("%d", &n);
    for (int i = 0; i < n; i++) scanf("%d", &q[i]);

    Merge_sort(q, 0, n - 1);

    for (int i = 0; i < n; i++) printf("%d ", q[i]);
    return 0;
}

 

3.头文件algorithm中的sort排序

//头文件algorithm中的sort排序
#include<iostream>
#include<cstdio>
#include<algorithm>

using namespace std;

const int N = 100000;
int q[N];
int n;

int main()
{
    scanf("%d", &n);
    for (int i = 0; i < n; i++) scanf("%d", &q[i]);

    sort(q, q + n);

    for (int i = 0; i < n; i++) printf("%d ", q[i]);
    return 0;
}

 


4.例题(注意去重)

题目描述

现有 n 个正整数,要求出这 n 个正整数中的第 k 个最小整数(相同大小的整数只计算一次)。

输入格式

第一行为 n 和 k; 第二行开始为 n 个正整数的值,整数间用空格隔开。

输出格式

第k个最小整数的值;若无解,则输出 NO RESULT

输入输出样例

输入

10 3
1 3 3 7 2 5 1 2 4 6

输出 

3

说明/提示

n≤10000,k≤1000,正整数均小于 30000。 


 

解法一.排序后使用unique伪去重

#include<iostream>
#include<cstdio>
#include<algorithm>  //使用unique(),就是把数组伪去重,重复的数放在数组末

using namespace std;

const int N = 10000;
int q[N];
int n, k;

int main()
{
    scanf("%d%d", &n, &k);
    for (int i = 0; i < n; i++) scanf("%d", &q[i]);

    sort(q, q+n);
    int ans = unique(q, q + n) - q;//给数组q去重,并让ans等于去重后非伪的长度

    if (k <= ans) printf("%d", q[k - 1]);
    else printf("NO RESULT");
}

解法二.桶排序(数组计数)

#include<iostream>
#include<cstdio>

using namespace std;

const int N = 10000;
int q[30000+1];//注意数组大小
int n, k;

int main()
{
    int a, count=0,max=0;
    cin>>n>>k;
    for (int i = 0; i < n; i++)
    {
        cin>>a;
        q[a]++;
        if(a>max) max=a;
    }
    for(int i=0;i<=max;i++)
    {
        if(q[i]>=1) count++;
        if(count==k)
        {
            printf("%d",i);
            return 0;
        }
    }
    printf("NO RESULT");
    return 0;
}

相关文章:

  • 互联网+房产中介+装修设计+物料市场+智能家居一体化平台需求书
  • 【Linux探索学习】第三十一弹——线程互斥与同步(下):深入理解确保线程安全的机制
  • Docker 部署 Graylog 日志管理系统
  • uniapp写的h5跳转小程序
  • Postman参数介绍
  • Teledyne PDS 2025版本多波束测量及后处理成图软件
  • Holoens2开发报错记录02_通过主机获取彩色和深度数据流常见错误
  • 【星云 Orbit-F4 开发板】03b. 按键玩法二:独立按键双击双击触发
  • ChatGPT背后的理论基础:从预训练到微调的深度解析
  • 06.模板初阶(template<typename T>,充分复用函数,函数模板和类模板的使用)
  • 防火墙双机热备---VRRP,VGMP,HRP(超详细)
  • 《我的AUTOSAR之路》Det 解析
  • 力扣练习之字符串的最大公因子
  • 联想 SR590 服务器 530-8i 更换损坏的硬盘
  • 何为第一二三产业?
  • <02.25>八股文
  • Docker run --add-host参数解析(在容器启动时向/etc/hosts文件中添加自定义的主机名与IP映射)(适用于临时调试或测试)
  • kvaser pythoncan 调用报错(x86 ubuntu工控机)
  • 笔记20250225
  • Shell 脚本--检测网络连通性
  • python可以做复杂网站/如何搜索关键词热度
  • 静态网站怎么入侵/网页设计与制作考试试题及答案
  • 网站建设和编程/核心关键词如何优化
  • 湖北外贸网站建设价格/如何注册网站
  • 网站建设需要掌握什么知识/自己搭建一个网站
  • 如何自己做软件网站/营销方案怎么写?