首页 > 其他分享 >快速排序-第k个数

快速排序-第k个数

时间:2023-07-09 22:31:55浏览次数:31  
标签:do 数列 int 个数 整数 while 排序 快速

JWvFczgRNg.jpg

题目

给定一个长度为 $n$ 的整数数列,以及一个整数 $k$,请用快速选择算法求出数列从小到大排序后的第 $k$ 个数。

输入格式 第一行包含两个整数 $n$ 和 $k$。

第二行包含 $n$ 个整数(所有整数均在 $1∼109$ 范围内),表示整数数列。

输出格式 输出一个整数,表示数列的第 $k$ 小数。

数据范围 $1≤n≤100000,1≤k≤n$ 输入样例:

5 3
2 4 1 5 3

输出样例:

3

思路

正常快速排序要排序两个区间, 该题只需考虑需要的结果存在的那个区间即可

代码

#include <iostream>

using namespace std;

const int N = 100010;
int n, m, f[N];

int quick_sort(int l, int r, int k)
{
    if (l >= r) return f[l];
    int x = f[l + r >> 1], i = l - 1, j = r + 1;
    while (i < j)
    {
        do i ++ ; while (f[i] < x);
        do j -- ; while (f[j] > x);
        if (i < j) swap(f[i], f[j]);
    }
    
    // 注意k>j的情况要减去 j - l + 1, 加1是因为结果是第几个数并非索引
    if (k <= (j - l + 1)) quick_sort(l, j, k);
    else quick_sort(j + 1, r, k - (j - l + 1));
}

int main()
{
    scanf("%d %d", &n, &m);
    for (int i = 0; i < n; i ++ ) scanf("%d", &f[i]);
    printf("%d", quick_sort(0, n - 1, m));
    
    return 0;
}

标签:do,数列,int,个数,整数,while,排序,快速
From: https://blog.51cto.com/u_16170343/6670092

相关文章

  • Seata-server.bat闪退问题解决及Seata快速搭建
    转:Seata-server.bat闪退问题解决及Seata快速搭建 1.4上 部署的话 参考下边的地址:seata部署指南(v1.6.1) 启动seata服务前请先做好配置 ......
  • Jenkins快速入门部署+实践
    安装方法一Jenkins中文网下载jenkins.war方法二直接从http://mirrors.jenkins-ci.org/war/latest/jenkins.war下载最新的war包,然后解压到某个固定目录就算安装完成了启动方式启动方法:java-jarjenkins.war即可打开浏览器进入链接http://localhost:8080如果安装过程......
  • 43. 排序算法
    一、什么是排序  排序也称排序算法,排序是将一组数组,依指定的顺序进行排列的过程。排序分为内部排序和外部排序两种。内部排序是指将需要处理的所有数据都加载到内部存储器中进行排序。外部排序是指数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。二、冒......
  • 堆排序之前篇:关于堆
      1. 堆的定义和性质堆是一种特殊的数据结构,它是一颗完全二叉树,且满足以下性质:堆中某个节点的值总是不大于或不小于其父节点的值。如果父节点的值不大于其子节点的值,这样的堆称为最小堆;如果父节点的值不小于其子节点的值,这样的堆称为最大堆。堆可以用数组来存储,因为......
  • 记录拖动排序
    最近项目中要做一个拖动排序功能,首先想到的是之前项目中用过的antd自带的tree和table的拖动排序,但是只能在对应的组建里使用。这里用的是自定义组件,随意拖动排序,所以记录一下实现流程react-dndantd组件的拖动排序都是用的这个库,使用比较灵活,但是要配置的东西比较多,需求复杂时使......
  • 1-快速上手SpringBoot
    1.SpringBoot入门程序制作(一)【idea联网版】步骤①:创建新模块,选择SpringInitializr,并配置模块相关基础信息特别关注:第3步点击Next时,Idea需要联网状态才可以进入到后面那一页,如果不能正常联网,就无法正确到达右面那个设置页了,会一直联网转圈特别关注:第5步选择java......
  • Java版归并排序 演示代码(带注释)
    Code:importjava.util.Arrays;/***归并排序*/publicclassMergeSort{/***私有化*/privateMergeSort(){}/***归并排序的sort方法*@paramarr待排序数组*@param<E>可比较的元素*/publicstatic<Eex......
  • 排序 sorted
    l=sorted([36,5,-12,9,-21])print(l)'''[-21,-12,5,9,36]'''l=sorted([36,5,-12,9,-21],key=abs)print(l)'''[5,9,-12,-21,36]''' #按照元祖里的key的name首字母lis=[('Bob',......
  • 快速等比数列求和
    快速等比数列求和1.等比数列求和公式要求给定的取余的数是质数,能求出逆元2.递归分解如果有偶数个,那么分解成两半,左边就为\(a_0+a_0q+a_0q^2...+a_0q^{n/2}\),另一半为\(a_0q^{n/2+1}+a_0q^{n/2+2}+a_0q^{n/2+3}...+a_0q^{n}\),令等比数列求和为一个函数\(f(n)\),就有\(f(n)=f......
  • Miller_Rabin算法快速判断大数是否为素数
    Miller_Rabin算法快速判断大数是否为素数并不是绝对,这只是一种判断大概率为素数的方法首先根据费马小定理有:\(a^{p-1}=1\pmodp(a不为p的倍数且p不是素数)\)又因为\(p\)为素奇数,所以\(p-1\)为偶数,表示为\(p-1=2^dm\)所以有\(a^{p-1}-1=0\pmodp\)\(a^{2^dm}-1=0\pmodp\)\((......