当前位置: 首页 > news >正文

【数据结构】排序(2)—冒泡排序 快速排序

   

                             

目录

一. 冒泡排序

基本思想

代码实现

时间和空间复杂度

稳定性

二. 快速排序

基本思想

代码实现

hoare法

挖坑法

前后指针法

时间和空间复杂度

稳定性


一. 冒泡排序

       基本思想

           冒泡排序是一种交换排序。两两比较数组元素,如果是逆序(即排列顺序与排序后的顺序相     反)就交换,直到所有元素都有序为止。

      方法步骤:                   

          ① 比较相邻的元素。如果第一个比第二个大,就交换他们两个。

          ② 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后                  的元素会是最大的数

          ③ 针对所有的元素重复以上的步骤,除了最后一个。

          ④ 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较

        图示

        

代码实现

  

//冒泡排序
void BubbleSort(int* a, int n)
{for (int i = 0; i < n - 1; i++){int flag = 0; //作为判断是否交换的标志for (int j = 1; j < n - i; j++){if (a[j-1] > a[j]){flag = 1;int tmp = a[j-1]; //交换a[j-1] = a[j];a[j] = tmp;}}if (flag == 0)break;}
}

时间和空间复杂度

     若初始序列为正序序列,则只需进行一趟排序,在排序过程中进行n-1次比较不移动元素;若初始序列为逆序序列,则需进行n-1趟排序n(n-1) / 2次比较,每次比较都需要移动 3 次,移动次数为  3n(n-1) / 2.

    时间复杂度:O(n^2)

    空间复杂度:O(1)

稳定性

     冒泡排序:稳定排序

二. 快速排序

      基本思想

       任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止
 

     方法步骤:       

  1. 从数列中挑出一个元素,称为 "基准"(pivot);

  2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;

  3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;

     图示

代码实现

   

 hoare法

        思想方法:

           定义两个指针 left 和 right,分别指向左边和右边,左指针从左向右找大( 大于pivotkey),右      指针从右向左找小(小于pivotkey),左大右小就交换,相遇时与基准值交换

         图解:

               

        

 

int PartSort(int* a, int left, int right) //给数组分区,返回枢轴元素下标
{int pivotkey = left;while (left < right){//右边找比pivotkey小的while (left < right && a[right] >= a[pivotkey])right--;//左边找比pivotkey大的while (left < right && a[left] <= a[pivotkey])left++;Swap(&a[left], &a[right]);}Swap(&a[left], &a[pivotkey]); //把记录的枢轴元素,交换到枢轴位置return left;   //返回枢轴所在的位置下标
}

   

 挖坑法

      思想方法

              定义两个指针 left 和 right,分别指向左边和右边,先将第一个数据元素放在临时变量 pivotkey 中,形成一个坑位右指针先走,当指向的值小于 pivotkey 就停下,形成新的坑位;让左指针走,当指向的值大于 pivotkey 就停下,使其形成此次的新坑位,直到两指针相遇,把pivotkey的值放入坑中。

 

        图解:

         

           


int PartSort(int* a, int left, int right) //给数组分区,返回枢轴元素下标
{int pivotkey = a[left]; //保存第一个数据元素的值while (left < right){while (left < right && a[right] >= pivotkey) //找小{right--;}a[left] = a[right]; //右边形成新的坑while (left < right && a[left] <= pivotkey) //找大{left++;}a[right] = a[left]; //左边形成新的坑}a[left] = pivotkey;return left;
}

  前后指针法

      思想方法:

        定义两个指针 prev 和 cur ,初始时,prev指针指向序列开头,cur指针指向prev指针的后一个位置;cur的值与pivotkey的值比较,cur的值小,prev先后移一步,cur再后移;当cur的值大时,就prev的值与cur的值交换;直到cur为空时,prev的值与pivotkey的值交换。

       图解:

              

       


int PartSort(int* a, int left, int right) //给数组分区,返回枢轴元素下标
{int prev = left;int cur = left + 1;int pivotkey = left;while (cur <= right){if (a[cur] < a[pivotkey] && ++prev != cur)Swap(&a[cur], &a[prev]);cur++;}Swap(&a[pivotkey], &a[prev]);return prev;
}

时间和空间复杂度

         在最优情况下,partition每次都划的很均匀,此时时间复杂度为O(nlogn);平均情况下,其时   间复杂度也为O(nlogn)。在最坏的情况下,待排序的序列为正序或逆序时,递归树是一棵斜树,   此时,快速排序会堕落为冒泡排序,其时间复杂度为O(n^2),不过可以通过优化,使其提升为O(nlogn),总的来说还是O(nlogn)。

        空间复杂度,主要是递归造成的栈空间的使用,最好情况及平均情况下,树的递归深度为logn,空间复杂度均为O(logn);最坏情况,空间复杂度为O(n).

       时间复杂度:O(nlogn)

       空间复杂度:O(logn)

  稳定性

      由于元素的比较和交换是跳跃进行的,因此

      快速排序:不稳定排序

相关文章:

【数据结构】排序(2)—冒泡排序 快速排序

目录 一. 冒泡排序 基本思想 代码实现 时间和空间复杂度 稳定性 二. 快速排序 基本思想 代码实现 hoare法 挖坑法 前后指针法 时间和空间复杂度 稳定性 一. 冒泡排序 基本思想 冒泡排序是一种交换排序。两两比较数组元素&#xff0c;如果是逆序(即排列顺序与排序后…...

Redis与分布式-分布式锁

接上文 Redis与分布式-集群搭建 1.分布式锁 为了解决上述问题&#xff0c;可以利用分布式锁来实现。 重新复制一份redis&#xff0c;配置文件都是刚下载时候的不用更改&#xff0c;然后启动redis服务和redis客户。 redis存在这样的命令&#xff1a;和set命令差不多&#xff0…...

docker安装nginx详解

创建html的挂载目录docker volume create nginx8020 创建conf的挂载目录mkdir -p /opt/nginx/conf 拉取镜像docker pull nginx 初始化挂载目录的配置文件docker run --rm --name nginx-short -p 8020:80 -d nginx docker cp nginx-short:/etc/nginx/nginx.conf /opt/nginx/…...

优化思考二

优化思考一_云湖在成长的博客-CSDN博客 翻到了两年前写文章&#xff0c;有了不一样的观点。 先说一样的想法吧&#xff1a;数据&#xff08;输入&#xff09;>>优化模型&#xff08;处理&#xff09;>>结果方案&#xff08;输出&#xff09;。优化是其中最重要的…...

大模型微调概览

文章目录 微调 和 高效微调高效微调技术方法概述高效微调方法一:LoRA高效微调方法二: Prefix Tuning高效微调方法三: Prompt Tuning高效微调方法四: P-Tuning v2基于强化学习的进阶微调方法RLHF 训练流程微调 和 高效微调 微调,Fine-Tuning, 一般指全参数的微调(全量微调),…...

利用norm.ppfnorm.interval分别计算正态置信区间[实例]

scipy.stats.norm.ppf用于计算正态分布的累积分布函数CDF的逆函数&#xff0c;也称为百分位点函数。它的作用是根据给定的概率值&#xff0c;计算对应的随机变量值。scipy.stats.norm.interval&#xff1a;用于计算正态分布的置信区间&#xff0c;可指定均值和标准差。scipy.st…...

计算机网络各层设备

计算机网络通常被分为七层&#xff0c;每一层都有对应的设备。以下是各层设备的简要介绍&#xff1a; 物理层&#xff08;Physical Layer&#xff09;&#xff1a;负责传输二进制数据位流的物理媒体和设备&#xff0c;例如网线、光纤、中继器、集线器等。 数据链路层&#xf…...

java this用法

在Java中&#xff0c;this是一个关键字&#xff0c;表示当前对象。它可以用来引用当前对象的实例变量、实例方法或者调用当前对象的构造方法。在本文中&#xff0c;我们将深入探讨Java中this关键字的用法。 1. 引用当前对象的实例变量 在Java中&#xff0c;this关键字可以用来…...

【AI视野·今日NLP 自然语言处理论文速览 第四十六期】Tue, 3 Oct 2023

AI视野今日CS.NLP 自然语言处理论文速览 Tue, 3 Oct 2023 (showing first 100 of 110 entries) Totally 100 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Its MBR All the Way Down: Modern Generation Techniques Through the …...

Unity ddx与ddy

有关Unity的dx与dy的概念 引用的文章 1link 2link 3link 4link 有关概念 我们知道在光栅化的时刻&#xff0c;GPUs会在同一时刻并行运行很多Fragment Shader&#xff0c;但是并不是一个pixel一个pixel去执行的&#xff0c;而是将其组织在2x2的一组pixels分块中&#xff0c;…...

bootstrap.xml 和applicaiton.properties和applicaiton.yml的区别和联系

当谈到Spring Boot应用程序的配置时&#xff0c;有三个关键文件经常被提到&#xff1a;bootstrap.xml、application.properties和application.yml。这些文件在应用程序的不同阶段起着不同的作用&#xff0c;并在配置应用程序属性时有一些区别和联系。本文将探讨这些文件的作用、…...

基于被囊群优化的BP神经网络(分类应用) - 附代码

基于被囊群优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于被囊群优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.被囊群优化BP神经网络3.1 BP神经网络参数设置3.2 被囊群算法应用 4.测试结果&#x…...

我的第一个react.js 的router工程

react.js 开发的时候&#xff0c;都是针对一个页面的&#xff0c;多个页面就要用Router了&#xff0c;本文介绍我在vscode 下的第一个router 工程。 我在学习react.js 前端开发&#xff0c;学到router 路由的时候有点犯难了。经过1-2天的努力&#xff0c;终于完成了第一个工程…...

XXPermissions权限请求框架

官网 项目地址&#xff1a;Github博文地址&#xff1a;一句代码搞定权限请求&#xff0c;从未如此简单 框架亮点 一马当先&#xff1a;首款适配 Android 13 的权限请求框架简洁易用&#xff1a;采用链式调用的方式&#xff0c;使用只需一句代码体积感人&#xff1a;功能在同类…...

远程代码执行渗透测试—Server2128

远程代码执行渗透测试 任务环境说明&#xff1a; √ 服务器场景&#xff1a;Server2128&#xff08;开放链接&#xff09; √服务器场景操作系统&#xff1a;Windows √服务器用户名&#xff1a;Administrator密码&#xff1a;pssw0rd 1.找出靶机桌面上文件夹1中的文件RCEBac…...

阿里云关系型数据库有哪些?RDS云数据库汇总

阿里云RDS关系型数据库大全&#xff0c;关系型数据库包括MySQL版、PolarDB、PostgreSQL、SQL Server和MariaDB等&#xff0c;NoSQL数据库如Redis、Tair、Lindorm和MongoDB&#xff0c;阿里云百科分享阿里云RDS关系型数据库大全&#xff1a; 目录 阿里云RDS关系型数据库大全 …...

Linux--socket编程--服务端代码

查看struct sockaddr_in包含的东西&#xff1a; 在/user/include下搜索&#xff1a;grep "struct sockaddr_in { " * -nir r : 递归 i &#xff1a; 不区分大小写 n : 显示行号 socket编程–服务端代码 /* 1、调用 socket 创建套接字 2、调用 bind 添加地址 3、lis…...

安装Vue脚手架图文详解教程

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 预备工作 在安装Vue脚手架之前&#xff0c;请确保您已经正确安装了npm&#xff1b;假若还尚未安装npm&#xff0c;请你参考 Node.js安装教程图文详解。 安装Vue脚手架 请…...

宠物医院必备,介绍一款宠物疫苗接种管理软件

在当今社会&#xff0c;养宠物已经成为越来越多人的生活方式&#xff0c;宠物疫苗接种已是宠物医院的重要工作&#xff0c;但是目前绝大多数的宠物医院对疫苗接种的管理&#xff0c;还是采取人工登记方式&#xff0c;不仅效率低下&#xff0c;而且无法做到疫苗接种到期自动提醒…...

哈哈,我保研985了,之后会出一期保研经验分享

哈哈&#xff0c;我保研了&#xff0c;之后会出一期保研经验分享 个人背景 学校&#xff1a;河南某四非&#xff0c;计算机科学与技术专业英语成绩&#xff1a;四级439&#xff0c;六级438&#xff08;夏令营无六级&#xff09;科研经历&#xff1a;一个软著、国家级大创&…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)

目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...

作为点的对象CenterNet论文阅读

摘要 检测器将图像中的物体表示为轴对齐的边界框。大多数成功的目标检测方法都会枚举几乎完整的潜在目标位置列表&#xff0c;并对每一个位置进行分类。这种做法既浪费又低效&#xff0c;并且需要额外的后处理。在本文中&#xff0c;我们采取了不同的方法。我们将物体建模为单…...

Docker环境下安装 Elasticsearch + IK 分词器 + Pinyin插件 + Kibana(适配7.10.1)

做RAG自己打算使用esmilvus自己开发一个&#xff0c;安装时好像网上没有比较新的安装方法&#xff0c;然后找了个旧的方法对应试试&#xff1a; &#x1f680; 本文将手把手教你在 Docker 环境中部署 Elasticsearch 7.10.1 IK分词器 拼音插件 Kibana&#xff0c;适配中文搜索…...