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

快速排序思想:

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.mzph.cn/news/656016.shtml

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

相关文章

NoSQL 数据库管理系统和模型的比较

前些天发现了一个人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;最重要的屌图甚多&#xff0c;忍不住分享一下给大家。点击跳转到网站。 NoSQL 数据库管理系统和模型的比较 介绍 当大多数人想到数据库时&#xff0c;他们通常会想到传统的关系数据库…

【TCP】流量控制和拥塞控制

前言 TCP&#xff08;传输控制协议&#xff09;是互联网协议&#xff08;IP&#xff09;网络传输层协议&#xff0c;负责控制数据包的顺序和流量控制&#xff0c;以防止网络拥塞和数据丢失。TCP流量控制和拥塞控制是确保网络有效通信的重要机制。具体分析如下&#xff1a; 流…

微服务-微服务Alibaba-Nacos 源码分析(上)

Nacos&Ribbon&Feign核心微服务架构图 架构原理 1、微服务系统在启动时将自己注册到服务注册中心&#xff0c;同时外发布 Http 接口供其它系统调用(一般都是基于Spring MVC) 2、服务消费者基于 Feign 调用服务提供者对外发布的接口&#xff0c;先对调用的本地接口加上…

利用qrcode.vue库生成二维码

利用qrcode.vue库生成二维码 安装 在vue2中 npm install --save qrcode.vue1 # yarn add qrcode.vue在vue3中 npm install --save qrcode.vue3 # yarn add qrcode.vue使用 普通使用&#xff1a; import { createApp } from vue import QrcodeVue from qrcode.vuecreateAp…

【Java程序设计】【C00168】基于SSM的旅游网管理系统(论文+PPT)

基于SSM的旅游网管理系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的旅游网系统 本系统分为用户前台功能模块和管理员功能模块2个功能模块。 用户前台功能模块&#xff1a;当游客打开系统的网址后&#xff0c;首先…

【Python笔记-设计模式】单例模式

一、说明 单例是一种创建型设计模式&#xff0c;能够保证一个类只有一个实例&#xff0c; 并提供一个访问该实例的全局节点。 (一) 解决问题 维护共享资源&#xff08;数据库或文件&#xff09;的访问权限&#xff0c;避免多个实例覆盖同一变量&#xff0c;引发程序崩溃。 …

React 基础学习02

以下是React18版本的基础学习资源 点击我获取更多学习资源 1. …模板扩展符 import logo from ./logo.svg; import ./App.css; function App() {const imgData {className: small,style: {wdith: 200px,height: 200px,backgroundColor: grey}}return (<div className&quo…

JavaWeb中的Filter(过滤器)和 Listener(监听器)

提示&#xff1a;这两个东西听起来似乎很难&#xff0c;实际上是非常简单的&#xff0c;按照要求写就行了&#xff0c;一定不要被新名词给吓到了。 JavaWeb中的Filter&#xff08;过滤器&#xff09; 一、Filter&#xff08;过滤器&#xff09;1.如何编写 Filter2.Filter 中的细…

最小二乘圆柱拟合(高斯牛顿法)

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 本期话题&#xff1a;最小二乘圆柱拟合 相关背景资料 点击前往 圆柱拟合输入和输出要求 输入 8到50个点&#xff0c;全部采样自圆柱上。每个点3个坐标&#xff0c;坐…

自动化测试的10大误区!

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

【EI会议征稿通知】2024年第四届激光,光学和光电子技术国际学术会议(LOPET 2024)

2024年第四届激光&#xff0c;光学和光电子技术国际学术会议(LOPET 2024) 2024 4th International Conference on Laser, Optics and Optoelectronic Technology 2024年第四届激光&#xff0c;光学和光电子技术国际学术会议(LOPET 2024)将于2024年5月17日-19日在中国重庆举行。…

长度最小的子数组[中等]

一、题目 给定一个含有n个正整数的数组和一个正整数target。找出该数组中满足其总和大于等于target的长度最小的连续子数组[numsl, numsl1, ..., numsr-1, numsr]&#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回0。 示例 1&#xff1a; 输入&#xff…

【iOS ARKit】光照效果--光源

光照 在现实世界中&#xff0c;光扮演了极其重要的角色&#xff0c;没有光万物将失去色彩&#xff0c;没有光世界将一片漆黑。在3D数字世界中亦是如此&#xff0c;3D数字世界本质上是一个使用数学精确描述的真实世界复本&#xff0c;光照计算是影响这个数字世界可信度的极其重要…

迷你型洗衣机好用吗?迷你内裤洗衣机排名前十名推荐

随着大家工作的压力越来越大&#xff0c;下了班之后只能想躺平&#xff0c;在洗完澡之后看着还需要手洗的内衣裤真的很头疼。有些小伙伴还有会攒几天再丢进去洗衣机里面一起&#xff0c;而且这样子是非常不好的&#xff0c;用过的内衣裤长时间不清洗容易滋生细菌&#xff0c;而…

Redis学习——高级篇④

Redis学习——高级篇④ Redis7高级之Redis与Mysql数据双写一致性工程案例&#xff08;四&#xff09; 4.1 MySQL主从复制原理4.2 canal 工作原理4.3 mySQL->canal->redis 双写一致性1.环境2.配置Mysql3.配置canal4. Canal客户端&#xff08;Java编写&#xff0…

【力扣经典面试题】27. 移除元素

题目描述&#xff1a; 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑…

JavaScript-for循环的执行顺序

1.目标 掌握for执行顺序 2.实现思路 使用for循环输出0-到5 3.代码实现 Document 4.总结 for执行顺序 1.执行 var i 0 变量初始化 条件判断 是否成立 成立 执行循环体 不成立 退出for循环

TypeScript(五) 条件语句

1. 条件语句 1.1. 描述 条件语句用于基于不同的条件来执行不同的动作。   条件语句是通过一条或多条语句的执行结果&#xff08;true或false&#xff09;来决定后面执行的代码块。 1.2. 常使用的条件语句 &#xff08;1&#xff09;if语句 - 只有当指定条件为true时&#…

STL_list

一、有关list的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向其前一个元素和后一个元素。Ii…

Docker容器引擎(6)

目录 一.什么是consul 解决什么问题&#xff1f; consul的模式&#xff1a; 二.consul 部署 consul服务器&#xff1a; 查看版本&#xff1a; 设置代理&#xff0c;在后台启动 consul 服务端&#xff1a; 进行后台启动&#xff1a; 查看集群信息&#xff1a; 访问页面…