一、基础算法-快速排序

news2024/12/22 9:32:31
1.快速排序

快速排序主要利用了分治的思想,具体步骤为:
step1 确定分界点,常用为q[left],q[right],q[mid],也可以是随机的
step2 调整区间,将比分界点小的放左边,大的放右边
step3 利用递归处理左右两端

快排属于分治算法,分治算法都有三步:
分成子问题,递归处理子问题,子问题合并
模板c++:

void quick_sort(int q[], int l, int r)
{
    //递归的终止情况
    if(l >= r) return;
    //第一步:分成子问题
    int i = l - 1, j = r + 1, x = q[l + 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);
    //第三步:子问题合并.快排这一步不需要操作,但归并排序的核心在这一步骤
}
do i++; while(q[i] < x);
会使得 q[l..i-1] <= x, q[i] >= x

do j--; while(q[j] > x);
会使得 q[j+1..r] >= x, q[j] <= x

if(i < j) swap(q[i], q[j]);
会使得 q[l..i] <= x, q[j..r] >= x

在这里插入图片描述
在这里插入图片描述
题解

例题:
在这里插入图片描述
python解法:

def quick_sort(l,r):
    if l>=r: #递归的终止条件
        return 
    i,j=l-1,r+1 #指针i,j指向左右两侧
    pivot=data[l+r>>1] #选择分界点
    while i<j:  #循环执行条件,左指针比右指针小
        while 1:  #不断循环直到找到比分界点值大的,等待放置在右边
            i+=1
            if data[i]>=pivot: #注意需要加上=号,因为如果两个值,2,1排序,会出现死循环
                break
        while 1: #不断循环直到找到比分界点值小的,停下来,等待放左边
            j-=1
            if data[j]<=pivot:
                break
        if i<j:  #满足条件左指针小,则交换
            data[i],data[j]=data[j],data[i]
    quick_sort(l,j) #递归处理左端
    quick_sort(j+1,r)
n=int(input())
data=list(map(int,input().split()))
quick_sort(0,n-1)
print(" ".join(map(str,data)))

C++解法:

#include <iostream>
using namespace std;
const int N=100010;
int q[N];
void quick_sort(int q[],int l,int r)
{
    if(l>=r) return;
    int i=l-1,j=r+1,x=q[l+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()
{
    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;
}

例题2:
在这里插入图片描述
Pthon解法:

def quick_sort(l,r):
    if l>=r:
        return 
    i,j,x=l-1,r+1,q[l+r>>1]
    while i<j:
        while 1:
            i+=1
            if q[i]>=x:
                break
        while 1:
            j-=1
            if q[j]<=x:
                break
        if i<j:
            q[i],q[j]=q[j],q[i]
    quick_sort(l,j)
    quick_sort(j+1,r)

n,k=map(int,input().split())
q=list(map(int,input().split()))
quick_sort(0,n-1)
print(q[k-1])

c++解法:

#include <iostream>
using namespace std;
const int N=100010;
int q[N];
void quick_sort(int q[],int l,int r)
{
    if(l>=r) return;
    int i=l-1,j=r+1,x=q[l+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()
{
    int n,k;
    scanf("%d %d",&n,&k);
    for(int i=0;i<n;i++) scanf("%d",&q[i]);
    quick_sort(q,0,n-1);
    printf("%d",q[k-1]);
    return 0;
}

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

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

相关文章

嵌入式Linux串口通信

嵌入式板子就和普通用的单片机比如stm32开发板&#xff0c;51开发板差不多&#xff0c;他们的串口都很类似&#xff0c;都是直接连上然后在PC机器上用串口软件打开就好了。 我使用的嵌入式开发板上面有8个rs485串口&#xff0c;2个rs232串口以及一个网口&#xff0c;刚开始开发…

代码随想录算法训练营第三十七天| LeetCode 738.单调递增的数字、总结

一、LeetCode 738.单调递增的数字 题目链接/文章讲解/视频讲解&#xff1a;https://programmercarl.com/0738.%E5%8D%95%E8%B0%83%E9%80%92%E5%A2%9E%E7%9A%84%E6%95%B0%E5%AD%97.html 状态&#xff1a;已解决 1.思路 如何求得小于等于N的最大单调递增的整数&#xff1f;98&am…

<计算机网络自顶向下> 多路复用与解复用

多路复用/解复用 端口号区分进程到进程多路解复用工作原理 解复用作用&#xff1a;TCP或者UDP实体采用哪些信息&#xff0c;将报文段的数据部分交给正确的socket&#xff0c;从而交给正确的进程主机收到IP数据报 每个数据报有源IP地址和目标地址每个数据报承载一个传输层报文段…

C++从入门到精通——const与取地址重载

const与取地址重载 前言一、const正常用法const成员函数问题const对象可以调用非const成员函数吗非const对象可以调用const成员函数吗const成员函数内可以调用其它的非const成员函数吗非const成员函数内可以调用其它的const成员函数吗总结 二、取地址及const取地址操作符重载概…

PPTX与PPT文件有什么区别?这2个办公技巧一定要知道!

每一次点击鼠标&#xff0c;每一次敲击键盘&#xff0c;我们都在与各种软件进行互动。其中&#xff0c;PPTX 和 PPT 无疑是职场中最常见的两种办公文档格式。那么&#xff0c;你是否清楚 PPTX 和 PPT 这两者之间的区别呢&#xff1f; 或许你会说&#xff0c;这不过是文件后缀名…

通过抖音短视频获客 只需要六步

抖音是当前最受欢迎的短视频平台之一&#xff0c;拥有庞大的用户群体和强大的社交矩阵&#xff0c;已经成为企业打造品牌口碑和快速获客的一种有效方式。那么&#xff0c;如何利用抖音短视频快速获客&#xff0c;打造品牌口碑呢&#xff1f;小马识途营销顾问简要分析如下&#…

【已解决】html页面刷新后css样式消失

登录失败后显示主页面时样式消失&#xff0c;如&#xff1a; 原因&#xff1a;index的样式引入css前面没有加斜杠 解决办法&#xff1a;添加斜杠 <link th:href"{/asserts/css/bootstrap.min.css}" rel"stylesheet"><link th:href"{/a…

【Git教程】(十四)基于特性分支的开发 — 概述及使用要求,执行过程及其实现,替代方案 ~

Git教程 基于特性分支的开发 1️⃣ 概述2️⃣ 使用要求3️⃣ 执行过程及其实现3.1 创建特性分支3.2 在 master 分支上集成某一特性3.3 将 master 分支上所发生的修改传递给特性分支 4️⃣ 替代方案4.1 直接在部分交付后的合并版本上继续后续工作4.2 到发行版即将成型时再集成特…

AI实践与学习4_大模型之检索增强生成RAG实践

背景 针对AI解题业务场景&#xff0c;靠着ToT、CoT等提示词规则去引导模型的输出答案&#xff0c;一定程度相比Zero-shot解答质量更高&#xff08;正确率、格式&#xff09;等。但是针对某些测试CASE&#xff0c;LLM仍然不能输出期望的正确结果&#xff0c;将AI解题应用生产仍…

Python接口自动化 —— Web接口!

1.2.1 web接口的概念 这里用一个浏览器调试工具捕捉课程管理页面请求作为例子&#xff1a; 当请求页面时&#xff0c;服务器会返回资源&#xff0c;将协议看做是路的话&#xff0c;http可以看做高速公路&#xff0c;soap看做铁路传输的数据有html&#xff0c;css&#xff0…

新游戏-开箱H5游戏【无限贝拉/疯狂骑士团】最新整理Linux手工服务端+详细搭建教程

小编教大家搭建游戏啦 一款H5奉上 先上图 然后再看教程 90GM基地&#xff1a;www.t1gm.com 默认解压密码&#xff1a;www.t1gm.com 本教程只限于技术研究使用&#xff0c;请勿用于商业用途。 本资源由90GM基地独家提供 90GM基地交流群&#xff1a;639140260 ★★★★…

Vue2 —— 学习(七)

目录 一、TodoList 案例&#xff08;第一版&#xff09; &#xff08;一&#xff09;组件化编码流程 1.实现静态组件 2.显示动态数据 &#xff08;二&#xff09;增加元素 &#xff08;三&#xff09;多选框状态确定 &#xff08;四&#xff09;删除元素 &#xff08;五…

Boost电感的作用

Boost电感在Boost升压电路中起着关键的作用。Boost电路是一种DC-DC电源转换器&#xff0c;其主要功能是将低电压直流&#xff08;DC&#xff09;信号转换为高电压直流&#xff08;DC&#xff09;信号。Boost电感在这个过程中起着平滑电流、储存能量和提高电路效率的作用。 具体…

【yolo数据集合并方法】

yolo数据集合并方法 1.数据集容2.数据集合并 1.数据集容 包含训练集、验证集和测试集。 每一个数据集中包含图像文件夹和标签文件夹。 yaml文件中定义了配置参数&#xff0c;包括目标识别的class类别&#xff1a; 2.数据集合并 需要修改labels文件夹下txt文件class信息&…

Vision Pro 零基础教程:1.机器视觉概述

文章目录 机器视觉简介机器视觉的发展历史机器视觉的结构组成机器视觉的应用工业相机分类1. 按传感器类型分类&#xff1a;2. 按分辨率分类&#xff1a;3. 按扫描方式分类&#xff1a;4. 按输出信号类型分类&#xff1a;5. 按应用领域分类&#xff1a;6. 按接口类型分类&#x…

TLS v1.3 导致JetBrains IDE jdk.internal.net.http.common CPU占用高

开发环境 GoLand版本&#xff1a;2022.3.4 问题原因 JDK 中的 TLS v1.3 实现引起 解决办法 使用 SOCKS 代理代替HTTP代理 禁用 Space 和 Code With Me 插件 禁用 TLS v1.3&#xff0c;参考&#xff1a;https://stackoverflow.com/questions/54485755/java-11-httpclient-…

IEDA 的各种常用插件汇总

目录 IEDA 的各种常用插件汇总1、 Alibaba Java Coding Guidelines2、Translation3、Rainbow Brackets4、MyBatisX5、MyBatis Log Free6、Lombok7、Gitee IEDA 的各种常用插件汇总 1、 Alibaba Java Coding Guidelines 作用&#xff1a;阿里巴巴代码规范检查插件&#xff0c;…

Spring-dataSource事务案例分析-使用事务嵌套时,一个我们容易忽略的地方

场景如下&#xff1a; A_Bean 中的方法a()中调用B_Bean的b();方法都开启了事务&#xff0c;使用的默认的事务传递机制&#xff08;即&#xff1a;属于同一事务&#xff09;&#xff1b; 如下两种场景会存在较大的差异&#xff1a; 在b()方法中出现了异常&#xff0c;在b()中进…

只用键盘的技巧

技巧一&#xff1a;将常用软件固定在任务栏使用winnum/winT(shift)打开 技巧二&#xff1a;winX快捷键&#xff08;显示快捷键的快捷键&#xff09; ALT F4    关闭当前应用程序 技巧三&#xff1a;使用好Chrome快键键 ctrl h&#xff1b;历史纪录。 ctrl shift esc&am…

致远互联FE协作办公平台 editflow_manager.jsp 存在SQL注入漏洞

0x01 免责声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;作者不为此承担任何责任。工具来自网络&#xff0c;安全性自测&#xff0c;如有侵权请联系删…