快速排序!

算法思想

partition函数

partition函数是快速排序算法中的一个关键部分。它的作用是将数组分区,并返回基准元素(pivot)的位置,使得基准元素左边的元素都小于它,右边的所有元素都大于或等于它。

函数签名

int partition(int a[], int l, int r)
a[] : 要进行分区的数组
l : 当前分区的起始索引
r : 当前分区的结束索引

变量定义

int i, j, pivot;
i 和 j : 用于遍历和分区数组的索引
pivot: 存储选取的基准元素的值

选择基准元素

int idx = l + rand() % (r - l + 1); pivot = a[idx]; Swap(&a[l], &a[idx]);
idx: 随机选择基准元素的索引,范围在[l,r]之间
快速排序」在众多排序算法中效率较高,平均时间复杂度为 O(nlogn)。但当完全有序时,最坏时间复杂度达到最坏情况 O(n^2)。
所以每次在选择基准数的时候,我们可以尝试用随机的方式选取,这就是「随机快速排序」。
pivot: 基准元素的值,即a[idx]
Swap(&a[l], &a[idx]): 将基准元素与当前分区的第一个元素交换,以便后续操作方便

初始化指针

i = j = l + 1;
i 和 j 都初始化为l+1,即基准元素之后的第一个元素

遍历并分区
while (i <= r)
{if (a[i] < pivox){Swap(&a[i], &a[j]);j++;}i++;
}

while(i <= r): 遍历当前分区的所有元素
如果a[i]小于基准元素pivot:
将a[i]和a[j]交换,得到a[j]位于较小元素的区域
增加j,以扩展较小元素的区域

最终交换

Swap(&a[l], &a[j - 1]);
将基准元素a[l]与a[j - 1]交换,将基准元素放到正确的位置

返回基准元素的位置

return j - 1;

完整函数
int partition(int a[], int l, int r)
{int i, j, pivot;int idx = l + rand() % (r - l + 1);pivot = a[idx];Swap(&a[l], &a[idx]);i = j = l + 1;while (i <= r){if (a[i] < pivot){Swap(&a[i], &a[j]);j++;}i++;}Swap(&a[l], &a[j - 1]);return j - 1;
}

QuickSort函数

QuickSort是快速排序算法的一个实现。快速排序是一种高效的排序算法,通常用于对大规模数据进行排序。它采用分而治之的策略,通过递归地对数组进行划分和排序,最终实现整个数组的有序排列。

函数定义

void QuickSort(int a[], int l, int r)
a[]: 待排序的数组
l: 数组的左边界索引(起始位置)
r: 数组的右边界索引(结束位置)

终止条件

if (l < r)
当l小于r时,表示当前子数组至少有两个元素需要排序,如果l不小于r,说明子数组已经有序或只有一个元素,不需要进一步操作

划分(partition)

int mid = partition(a, l, r);
partition函数的作用时将数组a的某一部分划分为两部分,并返回一个分界点mid,使得该点右边的元素都小于等于该点上的元素,右边的元素都大于等于该点上的元素。

递归调用

QuickSort(a, l, mid - 1);
QuickSort(a, mid + 1, r);
在partition之后,数组被分成了两个子数组:

  • 左子数组:范围是从l到mid-1
  • 右子数组:范围是从mid+1到r
    QuickSort递归地对这两个子数组分别进行排序,知道所有子数组都是有序的

完整函数

#include <stdio.h>
#include <stdlib.h>
#define maxn 1000001
int a[maxn];void Input(int n, int *a) // 从键盘输出数据到a数组中
{for (int i = 0; i < n; i++)scanf("%d", &a[i]);
}void Output(int n, int *a) // 把数组a的内容依次输出
{for (int i = 0; i < n; i++){if (i != 0)printf(" ");printf("%d", a[i]);}puts("");
}void Swap (int *a, int *b)
{int tmp = *a;*a = *b;*b = tmp;
}int partition(int a[], int l, int r)
{int i, j, pivot;int idx = l + rand() % (r - l + 1);pivot = a[idx];Swap(&a[l], &a[idx]);i = j = l + 1;while (i <= r){if (a[i] < pivox){Swap(&a[i], &a[j]);j++;}i++;}Swap(&a[l], &a[j - 1]);return j - 1;
}void QuickSort(int a[], int l, int r)
{if (l < r){int mid = partition(a, l, r);QuickSort(a, l, mid - 1);QuickSort(a, mid + 1, r);}
}
int main()
{int n;while (scanf("%d", &n) != EOF){Input(n, a);QuickSort(a, 0, n - 1);Output(n, a);}return 0;
}

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

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

相关文章

测试bert_base不同并行方式下的推理性能

测试bert_base不同并行方式下的推理性能 一.测试数据二.测试步骤1.生成bert配置文件2.安装依赖3.deepspeed 4卡tp并行4.FSDP 4卡并行5.手动将权值平均拆到4张卡,单进程多卡推理6.手动切分成4份,基于NCCL实现pipeline并行 本文测试了bert_base模型在不同并行方式下的推理性能 约…

最短路径与最小生成树:Dijkstra、Prim与Kruskal算法详解

在图论中&#xff0c;最短路径和最小生成树问题是两个重要的课题。本文将介绍三种经典的算法&#xff1a;Dijkstra、Prim和Kruskal&#xff0c;并对它们进行对比分析。我们将讨论这些算法解决的问题、各自的优劣性以及它们之间的异同点&#xff0c;并提供完整的代码示例。 Dij…

为什么电容两端电压不能突变

我们先从RC延时电路说起吧&#xff0c;图1是最简单的RC延时电路&#xff0c;给一个阶跃的电压信号&#xff0c;电压会变成黄色曲线这个样子&#xff0c;这是为什么呢&#xff1f; 图1 电压跳变后&#xff0c;电源负极电子移动到电容下极板&#xff0c;排斥上极板电子流动到电源…

c++实现二叉搜索树(上)

宝贝们&#xff0c;好久不见&#xff0c;甚是想念&#x1f917;小吉断更了差多有10多天&#xff0c;在断更的日子里&#xff0c;小吉也有在好好学习数据结构与算法&#xff0c;但是学的并不多而且学的并不是很认真。主要是中途笔记本屏出现问题了&#xff08;这件事有点让小吉我…

Neo4j连接

终端输入&#xff1a; neo4j console 浏览器访问&#xff1a;http://localhost:7474/ 输入用户名和密码&#xff1a;neo4j&#xff0c; 梦想密码&#xff08;首次neo4j&#xff09; 代码连接用新的服务器地址&#xff1a; g Graph(neo4j://localhost:7687, auth(neo4j, ))…

函数递归(C语言)(详细过程!)

函数递归 一. 递归是什么1.1 递归的思想1.2 递归的限制条件 二. 递归举例2.1 求n的阶乘2.2 按顺序打印一个整数的每一位 三. 递归与迭代3.1 求第n个斐波那契数 一. 递归是什么 递归是学习C语言很重要的一个知识&#xff0c;递归就是函数自己调用自己&#xff0c;是一种解决问题…

2024年中国移动游戏市场研究报告

来源&#xff1a;点点数据&#xff1a; 近期历史回顾&#xff1a; 面向水泥行业的5G虚拟专网技术要求&#xff08;2024&#xff09;.pdf 2024年F5G-A绿色万兆全光园区白皮书.pdf 2024年全球废物管理展望报告.pdf 内容管理系统 2024-2025中国羊奶粉市场消费趋势洞察报告.pdf 20…

Web端在线Stomp服务测试与WebSocket服务测试

Stomp服务测试 支持连接、发送、订阅、接收&#xff0c;可设置请求头、自动重连 低配置云服务器&#xff0c;首次加载速度较慢&#xff0c;请耐心等候 预览页面&#xff1a;http://www.daelui.com/#/tigerlair/saas/preview/lxbho9lkzvgc 演练页面&#xff1a;http://www.da…

Django之云存储(一)

一、介绍 用户上传的文件以及项目中使用的静态文件,除了保存在本地服务器,还在可以保存在云服务中,比如: 阿里云七牛云(课程选用)亚马逊云等1.1、使用方式 注册账号 七牛云开发者平台 实名认证 创建空间

pycharm终端pip安装模块成功但还是显示找不到 ModuleNotFoundError: No module named

报错信息&#xff1a; ModuleNotFoundError: No module named 但是分明已经安装过此模块&#xff1a; 在cmd运行pip list 查看所有安装过的包找到了安装过&#xff1a; 如果重新安装就是这样&#xff1a;显示已经存在了 问题排查&#xff1a; 直接根据重新安装的显示已存在的…

Beego 使用教程 9:ORM 操作数据库(上)

beego 是一个用于Go编程语言的开源、高性能的 web 框架 beego 被用于在Go语言中企业应用程序的快速开发&#xff0c;包括RESTful API、web应用程序和后端服务。它的灵感来源于Tornado&#xff0c; Sinatra 和 Flask beego 官网&#xff1a;http://beego.gocn.vip/ 上面的 be…

HCIP认证笔记(判断题)

192、两台LSR之间交换hello消息&#xff0c;触发LDP会话建立&#xff0c;hello消息会携带传输地址&#xff0c;传输地址大的一方将作为主动方&#xff1b; 193、两台LSR发送hello消息&#xff0c;其中hello消息会采用组播或单播的形式发送&#xff1b; 194、LSR ID&#xff1a;…

pikachu靶场通关全流程

目录 暴力破解&#xff1a; 1.基于表单的暴力破解&#xff1a; 2.验证码绕过(on server)&#xff1a; 3.验证码绕过(on client)&#xff1a; token防爆破&#xff1a; XSS&#xff1a; 1.反射型xss(get)&#xff1a; 2.反射性xss(post)&#xff1a; 3.存储型xss&#…

2024中国网络安全产品用户调查报告(发布版)

自2020年始&#xff0c;人类进入了21世纪的第二个十年&#xff0c;全球进入了百年未有之大变局&#xff0c;新十年的开始即被新冠疫情逆转了全球化发展的历程&#xff0c;而至2022年3月俄乌战争又突然爆发&#xff0c;紧接着2023年7月“巴以冲突"皱起&#xff0c;世界快速…

7.Nginx动静分离

介绍 把动态和静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。 动静分离从目前实现角度分为两种: 1.纯粹把静态文件独立成单独的域名,放在独立的静态资源服务器上,目前主流推崇的方案。 2.动态和静态文件混合在一起发布,通过nginx来分开。 通过loc…

Flutter基础 -- Flutter常用组件

目录 1. 文本组件 Text 1.1 基础用法 1.2 Text 定义 1.3 Text 示例 1.4 Text.rich、RichText 、TextSpan 1.5 RichText 示例 2. 导入资源 2.1 加入资源 2.2 加入图片 3. 图片组件 image 3.1 colorBlendMode 混合参数 3.2 fit 图片大小适配 3.3 ImageProvider 图片…

申请资质的企业如何证明其团队的专业性?

教育背景与专业资格&#xff1a; 提供团队成员的学历证明和专业资格证书&#xff0c;例如注册建筑师、注册结构工程师或其他相关专业领域的注册资格。这些证书应由权威机构颁发&#xff0c;证明个人的专业知识和技能水平。 工作经验&#xff1a; 展示团队成员的相关工作经验&a…

Java中的安全管理器和权限控制

Java安全管理器&#xff08;Security Manager&#xff09;是Java安全模型的重要组成部分&#xff0c;它提供了一种机制&#xff0c;通过检查和控制应用程序代码的行为来保护系统资源不被恶意代码滥用。本文将详细介绍Java安全管理器的基本概念、使用方法及其在实际项目中的应用…

Echarts 绘制自定义图形

文章目录 需求分析需求 在 Echarts 中绘制一个不规则图形放置在指定位置 分析 可以先从一个六边形画起 可以使用 ECharts 中的『自定义图形』来绘制一个封闭的六边形。以下是一个简单的示例代码,演示了如何使用 ECharts 绘制一个封闭的六边形: <!DOCTYPE html> &l…

《数据结构与算法之美》学习笔记二

前言&#xff1a;本篇文章介绍了一下二叉树中的基本知识点&#xff0c;包括二叉树的种类、二叉树的存储方式以及二叉树的深度和广度优先遍历&#xff1b;以及《数据结构与算法》中对于数组的讲解记录&#xff0c;只记录了本前端能看懂的&#x1f913;&#xff0c;还有很多知识点…