沥川的算法学习笔记:基础算法(1)----快速排序

1.快速排序

        快速排序是一种高效的排序算法,它利用了分治的思想。快速排序的基本思想是选择一个基准元素,将数组分成两个子数组,其中一个子数组的元素都小于等于基准元素,另一个子数组的元素都大于等于基准元素,然后对这两个子数组递归地应用快速排序算法。最后将两个子数组合并起来得到排序后的数组。

快速排序的具体步骤如下:

  1. 选择一个基准元素,通常是数组中的第一个元素或者随机选择。
  2. 将数组分成两个子数组,左边的子数组中的元素都小于等于基准元素,右边的子数组中的元素都大于等于基准元素。可以使用双指针的方式,一个指针从左边开始,一个指针从右边开始,然后交换两个指针所指向的元素,直到两个指针相遇。
  3. 对左右两个子数组递归地应用快速排序算法。
  4. 将左右两个子数组合并起来得到排序后的数组。

        快速排序的时间复杂度为O(nlogn),其中n为数组的大小。快速排序是一种原地排序算法,不需要额外的空间。但是快速排序是一种不稳定的排序算法,即相同元素的相对位置可能会发生变化。

#include <iostream> // 引入标准输入输出流库
using namespace std; // 使用标准命名空间const int N=1e6+10; // 定义常量N,表示数组的最大容量,1e6+10即1000000+10
int n; // 定义变量n,用于存储待排序元素的数量
int q[N]; // 定义整型数组q,用于存储待排序的元素// 快速排序函数
void quick_sort(int q[], int l, int r) {// 如果左边界索引大于等于右边界索引,说明子数组已经有序,直接返回if(l >= r) return;// 选择子数组的第一个元素作为基准int x = q[l];// 初始化两个指针,i指向左边界的前一个位置,j指向右边界后一个位置int i = l - 1, j = r + 1;// 当i和j没有相遇时,继续循环while(i < j) {// 从左向右移动i,直到找到一个大于等于基准的元素do {i++;} while (q[i] < x);// 从右向左移动j,直到找到一个小于等于基准的元素do {j--;} while (q[j] > x);// 如果i和j没有相遇,交换它们指向的元素if(i < j) swap(q[i], q[j]);}// 递归地对基准左侧的子数组进行快速排序quick_sort(q, l, j);// 递归地对基准右侧的子数组进行快速排序quick_sort(q, j + 1, r);
}int main() {// 从标准输入读取元素数量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]);}// 程序结束,返回0return 0;
}

        选择不同位置的基准元素会影响快速排序的性能。基准元素的选择可以影响递归过程中数组的划分效果,从而影响算法的时间复杂度和稳定性。

  1. 若选择第一个或最后一个元素作为基准元素:

    • 最好情况:如果数组已经有序或接近有序,选择第一个或最后一个元素作为基准元素可以得到较好的划分效果,此时快速排序的时间复杂度接近O(nlogn)。
    • 最坏情况:如果数组已经有序或接近有序,并且每次选择第一个或最后一个元素作为基准元素,则快速排序的时间复杂度会退化为O(n^2),这是因为每次划分只能将数组分成两个部分,其中一个部分为空,没有减少问题的规模。
    • 平均情况:平均情况下,选择第一个或最后一个元素作为基准元素可以得到较好的划分效果,快速排序的时间复杂度为O(nlogn)。
  2. 若选择随机位置的元素作为基准元素:

    • 通过随机选择基准元素,可以降低最坏情况的概率,避免快速排序时间复杂度退化为O(n^2)。
    • 选择随机位置的元素作为基准元素可以提高快速排序的平均性能,快速排序的时间复杂度为O(nlogn)。

        

        

                ​​​​​​​        

2.第K个数----类快排问题

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

输入格式

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

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

输出格式

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

分析

        本题实际上就是在快速排序的基础上多了找到第k个的元素,实现思路和方法与快排一致:

#include <iostream> // 引入标准输入输出流库
using namespace std; // 使用标准命名空间const int N=1e6+10; // 定义常量N,表示数组的最大容量,1e6+10即1000000+10
int n; // 定义变量n,用于存储待排序元素的数量
int q[N]; // 定义整型数组q,用于存储待排序的元素// 快速排序函数
void quick_sort(int q[], int l, int r) {// 如果左边界索引大于等于右边界索引,说明子数组已经有序,直接返回if(l >= r) return;// 选择子数组的中间元素作为基准int x = q[(l+r)/2];// 初始化两个指针,i指向左边界的前一个位置,j指向右边界后一个位置int i = l - 1, j = r + 1;// 当i和j没有相遇时,继续循环while(i < j) {// 从左向右移动i,直到找到一个大于等于基准的元素do {i++;} while (q[i] < x);// 从右向左移动j,直到找到一个小于等于基准的元素do {j--;} while (q[j] > x);// 如果i和j没有相遇,交换它们指向的元素if(i < j) swap(q[i], q[j]);}// 递归地对基准左侧的子数组进行快速排序quick_sort(q, l, j);// 递归地对基准右侧的子数组进行快速排序quick_sort(q, j + 1, r);
}int main() {// 从标准输入读取元素数量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]);}// 程序结束,返回0return 0;
}

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

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

相关文章

JavaCove部署文档

1. 基础配置 1.1服务器&#xff1a; 2 核 2G 1.2. 一个域名 1.3. 项目地址&#xff1a; gitee:https://gitee.com/guo-_jun/JavaCove github:https://github.com/nansheng1212/JavaCove 2. CentOS 安装 Docker 官方网站上有各种环境下的 安装指南&#xff0c;这里主要介绍…

jquery实现点击菜单实现高德地图定位点与数据展示联动效果

&#x1f34a;jquery实现点击菜单实现高德地图定位点与数据展示联动效果 版本介绍&#xff1a; jQuery v3.7.1高德地图JS API 2.0 代码仓库 ⭐ Gitee&#xff1a;实现点击菜单实现高德地图定位点与数据展示联动效果 1.启动说明 &#x1f4d4; 推荐VS Code编辑器插件Live Ser…

论文笔记:RelationPrompt :Zero-Shot Relation Triplet Extraction

论文来源: ACL Findings 2022 论文链接:https://arxiv.org/pdf/2203.09101.pdf 论文代码:http://github.com/declare-lab/RelationPrompt 本篇论文是由阿里达摩院自然语言智能实验室于2022年发表的关于零样本关系抽取的顶会论文,本篇博客将记录我在阅读过程中的一些笔记…

jmeter中对于有中文内容的csv文件怎么保存

jmeter的功能很强大&#xff0c;但是细节处没把握好就得不到预期的结果。今天来讲讲有中文内容的csv文件的参数化使用中需要注意的事项。 对于有中文内容&#xff0c;涉及到编码格式&#xff0c;为了让jmeter能正确地读取csv文件中的中文&#xff0c;需要把文件转码为UTF-8BOM…

OPENSSL-2023/11/10学习记录-C/C++对称分组加密DES

对称分组加密常用算法&#xff1a; DES 3DES AES 国密SM4 对称分组加密应用场景&#xff1a; 文件或者视频加密 加密比特币私钥 消息或者配置项加密 SSL通信加密 对称分组加密 使用异或实现一个简易的对称加密算法 A明文 B秘钥 AB密文AB (AB)B A 密码补全和初始化 数…

数据操作学习

1.导入torch。虽然被称为PyTorch&#xff0c;但应导入torch而不是pytorch import torch 2.张量表示一个数值组成的数组&#xff0c;这个数组可能有多个维度 xtorch.arange(12)x 3.通过张量的shape属性来访问张量的形状和张量中元素的总数 x.shape x.numel() 4.要改变张量的形…

LangGraph - Hierarchical Agent Teams

本文翻译整理自 Hierarchical Agent Teams https://langchain-ai.github.io/langgraph/tutorials/multi_agent/hierarchical_agent_teams/ 文章目录 一、前言二、设置三、创建工具四、Helper Utilities五、定义代理 Team研究 Team文档写作Team 六、添加图层 一、前言 在前面的…

【高阶数据结构】揭开红黑树‘恶魔’的面具:深度解析底层逻辑

高阶数据结构相关知识点可以通过点击以下链接进行学习一起加油&#xff01;二叉搜索树AVL树 大家好&#xff0c;我是店小二&#xff0c;欢迎来到本篇内容&#xff01;今天我们将一起探索红黑树的工作原理及部分功能实现。红黑树的概念相对抽象&#xff0c;但只要我们一步步深入…

Java使用HttpClient5实现发送HTTP请求

1、HttpClient5 的介绍 HttpClient5 是 Apache HttpComponents 项目中的一个重要组件&#xff0c;它是一个功能齐全且高度可定制的 HTTP 客户端库&#xff0c;专门用于发送 HTTP 请求、处理 HTTP 响应并支持各种 HTTP 协议特性。 以下是对 HttpClient5 的详细介绍&#xff1a…

部署Qwen2.5-7b大模型详解

部署Qwen2.5-7b大模型详解 本文参考教程&#xff1a;https://qwen.readthedocs.io/en/latest/getting_started/quickstart.html 下载模型 https://modelscope.cn/organization/qwen 搜索 qwen2.5-7b 可以看到它提供了六个模型&#xff0c;以满足不同的需求&#xff0c;从下…

【RoadRunner】自动驾驶模拟3D场景构建 | 软件简介与视角控制

&#x1f4af; 欢迎光临清流君的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落 &#x1f4af; &#x1f525; 个人主页:【清流君】&#x1f525; &#x1f4da; 系列专栏: 运动控制 | 决策规划 | 机器人数值优化 &#x1f4da; &#x1f31f;始终保持好奇心&…

【MATLAB代码,带TDOA数据导入】TDOA三维空间的位置(1主锚点、3副锚点),多个时间点、输出位置的坐标

TDOA介绍 TDOA&#xff08;到达时间差&#xff09;是一种用于定位和跟踪信号源的技术&#xff0c;常用于无线通信、导航和雷达系统。它通过测量信号到达不同接收器的时间差&#xff0c;来计算信号源的位置。 基本原理 TDOA的基本原理是利用多个接收器&#xff08;或锚点&…

Power BI - 设置Waterfall Chart第一个Pillar的颜色

1.简单介绍 有的用户可能会单独设置Column Chart&#xff08;条形图&#xff09;的第一个柱子的颜色&#xff0c;如下图所示&#xff0c; 这种其实可以通过Column Chart的Conditional formating进行设置&#xff0c; - SWICH SELECTEDVALUE 或者也可以直接对单独的Column进行…

用户界面设计:视觉美学与交互逻辑的融合

1、什么是用户界面 用户界面&#xff08;UI&#xff09;是人与机器之间沟通的桥梁&#xff0c;同时也是用户体验&#xff08;UX&#xff09;的重要组成部分。用户界面设计包括两个核心要素&#xff1a;视觉设计&#xff08;即产品的外观和感觉&#xff09;和交互设计&#xff…

CSS 入门

1. CSS 1.1 概念 CSS&#xff08;Cascading Style Sheet&#xff09;&#xff0c;层叠样式表&#xff0c;用于控制页面的样式 CSS 能够对网页中元素位置的排版进行像素级精确控制&#xff0c;实现美化页面的效果&#xff0c;能够做到页面的样式和结构分离&#xff08;类似于…

【数字图像处理】第5章 图像空域增强方法

上理考研周导师的哔哩哔哩频道 我在频道里讲课哦 目录 5.1 图像噪声 相关概念 ①图像噪声的产生 ② 图像噪声分类 ③ 图像噪声特点 5.2 图像增强方法分类 ①图像增强概念 ②图像增强目的 ③图像增强技术方法: 5.3 基于灰度变换的图像增强 1. 概述: 2. 灰度变换…

十大云手机排行榜:哪个云手机更好用?

近些年&#xff0c;市场上涌现出许多云手机产品&#xff0c;不同产品适合的应用场景也各不相同。在选用云手机之前&#xff0c;企业和个人用户需要了解它们的功能、特点以及适用的场景。本文将对当前主流的云手机进行对比&#xff0c;帮助大家挑选出最适合的云手机产品。 1. 红…

【数据结构与算法】之链表详解

链表是一种常用的数据结构&#xff0c;它是一种线性数据结构&#xff0c;但与数组不同&#xff0c;它并非连续存储数据&#xff0c;而是通过指针将数据节点连接起来。每个节点都包含数据域和指向下一个节点的指针域。这种结构赋予链表独特的优势和局限性&#xff0c;使其在某些…

九种排序,一次满足

我们在算法题进行练习提升时&#xff0c;经常会看到题目要求数据从大到小输出&#xff0c;从小到大输出&#xff0c;前一半从小到大输出&#xff0c;后一半从大到小输出等&#xff0c;那么这时候就需要用到排序算法&#xff0c;通过排序算法将数据按照一定的顺序进行排序。本文…

解决PyCharm 2023 Python Packages列表为空

原因是因为没有设置镜像源 展开 > 之后&#xff0c;这里 点击齿轮 添加一个阿里云的源 最后还需要点击刷新 可以选择下面的任意一个国内镜像源&#xff1a; 清华&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple 阿里云&#xff1a;http://mirrors.aliyun.com/…