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

【分治法】第k个数(快速选择算法,结合快速排序)

目录:

  • 🌵🌵🌵前言
      • 题目:
      • 解法1、用j分段
      • 解法2、用i分段
  • ❤️❤️❤️忙碌的敲代码也不要忘了浪漫鸭!

🌵🌵🌵前言

✨你好啊,我是“ 怪& ”,是一名在校大学生哦。
🌍主页链接:怪&的个人博客主页
☀️博文主更方向为:课程学习知识、作业题解、期末备考、项目实战等,随着专业的深入会越来越广哦…一起期待。
❤️一个“不想让我曾没有做好的也成为你的遗憾”的博主。
💪很高兴与你相遇,一起加油!

题目:

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

  • 输入格式
    第一行包含两个整数 n 和 k。
    第二行包含 n 个整数(所有整数均在 1∼109 范围内),表示整数数列。

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

  • 数据范围
    1≤n≤100000,
    1≤k≤n

  • 输入样例:
    5 3
    2 4 1 5 3

  • 输出样例:
    3

解法1、用j分段

a[j]<=x,a[j]算入左半段,分段为(l,j)(j+1,r)
避免右边界问题 x=a[(l+r)/2]x=a[l]

  • int length=j-l+1; //j算入左半段
  • if(length>=k) return quick_sort(l,j,k);
  • else return quick_sort(j+1,r,k-length);
#include <iostream>

using namespace std;
const int N =1e5+10;
int a[N];
int n,k;//数字个数,与第k个数


int quick_sort(int l,int r,int k){
    if(l==r) return a[l]; //区间内仅一个数,直接返回
    int x=a[l+r>>1]; 
    //int x=a[(l+r)/2];  //避免右边界问题 x=a[(l+r)/2]或x=a[l]
    int i=l-1,j=r+1; //循环每次先移动一位才判断
    
    while(i<j){//两者未穿过则一直执行
        do{
            i++;    //移动至a[i]>=x
        }while(a[i]<x);
        do{
            j--;    //移动至a[j]<=x
        }while(a[j]>x);        
        if(i<j) swap(a[i],a[j]); //两者未穿过才交换
    }
    //i>=j
    //此时a[i]>=x,a[i]左方皆<=x,a[i]右方(含a[i])皆>=x
    //此时a[j]<=x,a[j]左方(含a[j])皆<=x,a[j]右方皆>=x
    
    int length=j-l+1;
    if(length>=k) return quick_sort(l,j,k);
    else return quick_sort(j+1,r,k-length);
}

int main(){
    cin>>n>>k;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    int out=quick_sort(0,n-1,k);
    cout<<out<<endl;
    return 0;
}

解法2、用i分段

a[i]>=x,a[i]算入右半段,分段为(l,i-1)(i,r)
避免左边界问题 x=a[(l+r+1)/2]x=a[r]

  • int length=i-l;
  • if(length>=k) return quick_sort(l,i-1,k);
  • else return quick_sort(i,r,k-length);
#include <iostream>

using namespace std;
const int N =1e5+10;
int a[N];
int n,k;//数字个数,与第k个数


int quick_sort(int l,int r,int k){
    if(l==r) return a[l]; //区间内仅一个数,直接返回
    int x=a[(l+r+1)/2];  //避免左边界问题 x=a[(l+r+1)/2]或x=a[r]
    // int x=a[r]; // √可用    
    int i=l-1,j=r+1; //循环每次先移动一位才判断
    
    while(i<j){//两者未穿过则一直执行
        do{
            i++;    //移动至a[i]>=x
        }while(a[i]<x);
        do{
            j--;    //移动至a[j]<=x
        }while(a[j]>x);        
        if(i<j) swap(a[i],a[j]); //两者未穿过才交换
    }
    //i>=j
    //此时a[i]>=x,a[i]左方皆<=x,a[i]右方(含a[i])皆>=x
    //此时a[j]<=x,a[j]左方(含a[j])皆<=x,a[j]右方皆>=x
    
    int length=i-l;
    if(length>=k) return quick_sort(l,i-1,k);
    else return quick_sort(i,r,k-length);
}

int main(){
    cin>>n>>k;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    int out=quick_sort(0,n-1,k);
    cout<<out<<endl;
    return 0;
}

❤️❤️❤️忙碌的敲代码也不要忘了浪漫鸭!

📣📣分治法专栏:点我,直达《分治法》专栏哦!
💪💪cjdl,让我们一起从菜鸟开始……
🍉🍉昨天是国庆哎,你的第一天假期怎么样呀?
🌻🌻小遗憾昨天没有在C站更文呜呜呜,错失七天连更小奖励,不过昨天也真的很不错很不错很开心很开心的哈哈!

请添加图片描述

相关文章:

  • 西瓜书研读——第四章 决策树:ID3、C4.2、CSRT算法
  • aistudio 常规赛:钢铁缺陷检测挑战赛 经验总结,轻松复现map 47排名再度提升
  • 学习小发现-04-如何从字符串中提取数字并转换为整型输出、如何在%d输入内容中判断整型并只读取数字以整型输出、scanf的各种用法
  • Python中的闭包
  • Java知识【继承中的成员访问特点】
  • <Linux进程控制(2)>——《Linux》
  • 嵌入式软件编程模式
  • VL8 使用generate_for语句简化代码
  • 从零开始搭建uni-app框架的小程序开发环境
  • 【web】TCP/UDP协议详解(字节二面:TCP三次握手、四次挥手)
  • C++打怪升级(二)- 引用详解
  • MongoDB的日志目录被删除了,导致无法启动:(code=exited, status=1/FAILURE)
  • 数据我爬定了,限流也挡不住,我说的
  • 可持久化线段树
  • 计算机网络-网络层篇-子网划分
  • [译]Python中的类属性与实例属性的区别
  • Angular2开发踩坑系列-生产环境编译
  • css选择器
  • DataBase in Android
  • egg(89)--egg之redis的发布和订阅
  • Flex布局到底解决了什么问题
  • Hibernate【inverse和cascade属性】知识要点
  • java多线程
  • js操作时间(持续更新)
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • Web设计流程优化:网页效果图设计新思路
  • 订阅Forge Viewer所有的事件
  • 工程优化暨babel升级小记
  • 将 Measurements 和 Units 应用到物理学
  • 前端性能优化——回流与重绘
  • 人脸识别最新开发经验demo
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 手写双向链表LinkedList的几个常用功能
  • 双管齐下,VMware的容器新战略
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 微信支付JSAPI,实测!终极方案
  • 译米田引理
  • 鱼骨图 - 如何绘制?
  • 再谈express与koa的对比
  • 正则表达式
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • !!Dom4j 学习笔记
  • !$boo在php中什么意思,php前戏
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #include<初见C语言之指针(5)>
  • (2)STM32单片机上位机
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐