【基础算法】1、快速排序快速选择

news2024/10/6 6:47:18

快速排序思想:

1、找一个分界点。

2、在分界点两边开始调整范围。

3、递归两边,重复。

 

例题:

给定你一个长度为 n的整数数列。

请你使用快速排序对这个数列按照从小到大进行排序。

并将排好序的数列按顺序输出。

输入格式

输入共两行,第一行包含整数 n

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

输出格式

输出共一行,包含 n个整数,表示排好序的数列。

数据范围

1≤n≤100000

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

代码如下:

#include <iostream>
using namespace std;
const int N=100010;
 int q[N]={0};

void quick_sort(int q[],int l,int r)
{
     if(l>=r) return;   //如果左边界=右边界,直接退出
    int i=l-1;  //让指针往外走一位,为了就是保证能够先执行++操作,使得具有一般性
    int j=r+1;

    int x=q[l+r>>1];    
    /*
    位运算/2,取得对比值是中间数,如果取两边的边缘值,
    可能造成超时。
    */

    while(i<j)
    {
        do  i++ ;while(q[i]<x);
        do  j-- ;while(q[j]>x);
        if(i<j)
            swap(q[i],q[j]);
    }
    /*
    快速排序,当左边指针i一路满足条件时,不断往下走。当i遇到不满足条件的,
    进行j--操作,当j不满足时,两个while都跳出去了,此时若i<j,则执行交换功能,
    将二者所指向的具体数字交换,
    1、如果此时仍然满足i<j,那么重复大while循环
    2、如果i>j,那么直接跳出大while循环,进入下面的递归。
    */

    quick_sort(q,l,j);  
    quick_sort(q,j+1,r);
    /*
    接2、此时应该是i到了j的右边,想要将区间划分,只能让左边界到靠左边的j
    即sort(q,l,j);
    同理,右边界的起始点是j+1,则有:
    sort(q,j+1,r);
    */

}

int main()
{

    int n;


  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;

}

此算法的时间复杂度是O(nlogn)

快速选择算法思想:

1、找出分界点x

2、左边的所有元素<=x,右边的所有元素>=x

3、左区间元素个数为s1,右区间为s2.如果所选择的元素位数k在左区间,则为位置为k,落在右区间,则所在位置为r-s1

4、k在左边,递归左边。k在右边,递归右边

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

输入格式

第一行包含两个整数 n 和 k。

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

输出格式

输出一个整数,表示数列的第 k个数。

数据范围

1≤n≤100000
1≤k≤n

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

代码如下:

#include <iostream>
using namespace std;


int n;
int k;
const int N =1e5+10;
int q[N];



int quick_sort(int q[],int l,int r,int k)
{
    
    
    if(l==r)        //区间分割只剩下一个元素,此元素为所求元素
    return q[l];
    
    int x = q[l];    
    int i=l-1;
    int j=r+1;
    while(i<j)
    {
    while(q[++i] < x);
    while(q[--j] > x);
    if(i<j) swap(q[i],q[j]);
    }
    
    int s1=j+1-l;    //s1是此时左边的元素个数
    if(k<=s1) return quick_sort(q,l,j,k);        //k在左边,递归左边即可
    if(k>s1) return quick_sort(q,j+1,r,k-s1);    //k在右边,递归右边即可
                                                 //注意k在左右两区间的位置不同
    
    
    
    
    
}
int main()
{
    cin>>n>>k;
    for(int i=0;i<n;i++)
    cin>>q[i];
    
    
    cout<<quick_sort(q,0,n-1,k);
    
    return 0;
    
}

此算法的时间复杂度为O(n)

如果先用快速排序算法排序,再选出第k个数,时间复杂度相对较高。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1420233.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【软考问题】-- 5 - 知识精讲 - 项目进度管理

一、基本问题 项目进度管理&#xff08;按时完成&#xff09; 1&#xff1a;紧前关系绘图法&#xff1f; 定义&#xff1a;它是创建进度模型的一种技术。别称&#xff1a; PDM、前导图法、单代号网络图&#xff08;只有节点需要编号&#xff09;、活动节点图&#xff08;AON&a…

自动化测试系列 —— UI自动化测试!

UI 测试是一种测试类型&#xff0c;也称为用户界面测试&#xff0c;通过该测试&#xff0c;我们检查应用程序的界面是否工作正常或是否存在任何妨碍用户行为且不符合书面规格的 BUG。了解用户将如何在用户和网站之间进行交互以执行 UI 测试至关重要&#xff0c;通过执行 UI 测试…

git push后,如何撤销git log上的错误注释

修改了本地的代码&#xff0c;执行了下面的操作&#xff0c;提交之后&#xff0c;怎么样修改 git add ********(文件名)//git add 添加修改文件名之后 git commit //git commit 在当前分支提交&#xff0c;编写提交注释 git push //git push 提交修…

基于视觉的移载协作机器人机床上下料末端纠偏算法

摘 要 针对复合机器人在机床上下料中的定位方法,本文主要关注识别机床卡盘和末端作业面的定位。首先分 析了复合机器人在机床上下料过程中的工作原理及其基本结构,包括 AGV (自动导引车)和协作机器人 的功能及特点。然后,详细阐述了如何使用视觉系统和纠偏算法来…

合合信息TextIn服务使用心得

目录 一、前言二、TextIn简介2.1、通用文字识别2.2、国内通用票据识别2.3、通用表格识别 三、项目案例3.1、application.yml3.2、TextInService3.3、TextInController3.4、测试 四、总结 一、前言 智能图像处理、文字表格识别、文档内容提取产品的背景源自于人工智能技术的快速…

自动化测试的10大误区!

自动化测试因提高效率&#xff0c;减少重复工作的特性而被广泛采用。然而&#xff0c;随着自动化测试的普及&#xff0c;自动化测试也面临一系列挑战和误解。 这些误区不仅影响了测试的有效性&#xff0c;还会导致一定的项目风险&#xff0c;为了确保自动化测试能够真正提升测…

YOLOv8改进 | 可视化热力图 | 支持YOLOv8最新版本密度热力图,和视频热力图

一、本文介绍 本文给大家带来的机制是集成了YOLOv8最新版本的可视化热力图功能,热力图作为我们论文当中的必备一环,可以展示出我们呈现机制的有效性,本文的内容支持YOLOv8最新版本的根据密度呈现的热力图,同时支持视频检测,根据视频中的密度来绘画热力图。 在开始之前给…

方案:将vue项目放在SpringMVC中,并用tomcat访问

需要先将项目生成一次war包才能访问项目的webapp文件夹下的资源&#xff0c;否则tomcat的webapp文件夹下面不会生成对应资源文件夹就无法访问。 问题&#xff1a;目录如下&#xff1a; 今天我测试了一下将vue打包后&#xff0c;放入webapp下面访问&#xff0c;却发现vue项目无…

基于C#制作一个连连看小游戏

基于C#制作一个连连看小游戏,实现:难易度选择、关卡选择、倒计时进度条、得分计算、音效播放等功能。 目录 引言游戏规则开发环境准备游戏界面设计游戏逻辑实现图片加载与显示鼠标事件处理游戏优化与扩展添加关卡与难度选择说明</

C++ ffmpeg RTSP 视频推流实现, arm linux平台

环境&#xff1a; FFmpeg版本&#xff1a;n4.2.2 下载地址&#xff08;下载编译后请确认版本正确&#xff09;&#xff1a; https://ffmpeg.org//download.html 下面地址经过第三方git加速可能存在实效性&#xff1a; https://hub.fgit.cf/FFmpeg/FFmpeg/tree/n4.4.2实现代码…

MicroPython核心:映射和字典

MicroPython字典和映射使用称为开放寻址和线性探测的技术&#xff0c;本文详细介绍了这两种方法。 开放寻址 开放寻址用于解决碰撞问题&#xff0c;碰撞是非常常见的现象&#xff0c;当两个条目恰好散列到同一个槽或位置时就会发生碰撞。例如&#xff0c;散列设置如下&#x…

【教程】极简Docker搭建“帕鲁幻兽PalWorld”服务器, 附资源

注意&#xff1a; 如果搭建在个人服务器或者内网中&#xff0c;需要做内网穿透&#xff0c;可以看这篇博客&#xff1a; 【教程】超详细安装和使用免费内网穿透软件Zerotier-One-CSDN博客文章浏览阅读523次&#xff0c;点赞8次&#xff0c;收藏8次。真的很详细https://blog.csd…

14个国产AI大模型备案获批,众多科技巨头进入AIGC赛道

北京商报官网消息&#xff0c;第四范式、什么值得买、新壹科技、衔远科技、小米、智联招聘、Boss直聘、脉脉等13家企业的&#xff0c;14个国产AI大模型通过《生成式人工智能服务管理暂行办法》备案&#xff0c;可实现商业化应用。 自2023年8月&#xff0c;文心一言、讯飞星火、…

在Windows中如何格式化硬盘?这里提供了详细的步骤

格式化硬盘意味着擦除硬盘上的任何信息和设置文件系统,以便操作系统可以从硬盘读取数据并将数据写入硬盘。如果你计划在Windows中使用硬盘,则需要格式化硬盘。 如何在Windows中格式化硬盘 按照以下简单步骤在Windows 11,Windows 10,Windows 8,Windows 7,Windows Vista或…

【机器学习前置知识】隐变量

隐变量又称潜变量&#xff0c;顾名思义就是隐藏着的随机变量&#xff0c;它不能通过观测来得到&#xff0c;或者说它产生的过程是不可观测的&#xff0c;然而它却可以在潜移默化中影响可观测变量。 我们用抛硬币为例来解释什么是隐变量。假设有 A 、 B 、 C A、B、C A、B、C …

jrt运维命令改造

以前发布网站都是定死网站放置路径的&#xff0c;现在JRT想面向更广范围推广&#xff0c;所以就不能明确确定网站放置目录&#xff0c;为此需要改造一下jrt命令和sh来满足目录不确定情况和多个程序用不同管理命令的要求。 以前是写死的&#xff0c;现在改为调程序运行目录的sh…

Redhat 8.4 一键安装 Oracle 11GR2 单机版

Oracle 一键安装脚本&#xff0c;演示 Redhat 8.4 一键安装 Oracle 11GR2 单机版过程&#xff08;全程无需人工干预&#xff09;&#xff1a;&#xff08;脚本包括 ORALCE PSU/OJVM 等补丁自动安装&#xff09; ⭐️ 脚本下载地址&#xff1a;Shell脚本安装Oracle数据库 脚本…

利用OpenCV检测物流过程中的暴力拆箱和暴力拿放行为

背景介绍&#xff1a; 随着电子商务的快速发展&#xff0c;物流行业面临着越来越多的挑战。其中&#xff0c;暴力拆箱和暴力拿放成为最突出的问题之一。这些行为不仅会导致货物损坏&#xff0c;还会给物流公司和消费者带来巨大的经济损失。传统的解决方法依赖于人工监控&#x…

git仓库批量备份

git的mirror参数 在git中&#xff0c;--mirror是一个用于克隆和推送操作的参数。它用于创建一个镜像仓库&#xff0c;包含了源仓库的所有分支、标签和提交历史记录。 当使用git clone --mirror <source-repo>命令时&#xff0c;会创建一个完全相同的镜像仓库&#xff0…

P1012 [NOIP1998 提高组] 拼数题解

题目 设有n个正整数,将它们联接成一排&#xff0c;相邻数字首尾相接&#xff0c;组成一个最大的整数。 输入输出格式 输入格式 第一行有一个整数&#xff0c;表示数字个数n。 第二行有n个整数&#xff0c;表示给出的n个整数。 输出格式 一个正整数&#xff0c;表示最大的…