交换排序(冒泡排序)(快速排序(1))

目录

1.交换排序

(1)冒泡排序

(2)快速排序

1.交换排序

基本思想:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。
(1)冒泡排序
冒泡排序的特性总结:
        1. 冒泡排序是一种非常容易理解的排序
        2. 时间复杂度: O(N^2)
        3. 空间复杂度: O(1)
        4. 稳定性:稳定
冒泡的主要思想是 一趟一趟将最大、次大等等数据排放到最后的位置:
如:(单趟)
        for (int i = 1; i < n; i++){if (a[i - 1] > a[i]){Swap(&a[i - 1], &a[i]);}}

放完最大的数据到达数组最后一个位置后,就可以屏蔽最后一个位置(end下标)。

即n--;

完整冒泡:

// 冒泡排序
void BubbleSort(int* a, int n)
{for (int j = 0; j < n; j++){int flag = 1;for (int i = 1; i < n - j; i++){if (a[i - 1] > a[i]){Swap(&a[i - 1], &a[i]);flag = 0;}}if (flag)break;}
}

flag标注的原因仅是防止有序时遍历n^2;

(2)快速排序
快速排序是 Hoare 1962 年提出的一种二叉树结构的交换排序方法,其基本思想为: 任取待排序元素序列中 的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右 子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止

与二叉树的思想大致类似,熟悉二叉树的遍历递归后,这块部分理解起来就会相对容易(本人感觉还是有点难度)。

核心思想:

    while (l < r){while (l < r && a[r] >= a[keyi]){r--;}while (l < r && a[l] <= a[keyi]){l++;}Swap(&a[l], &a[r]);}

之后,可以将keyi移到中间位置,这时左边全是比他小的数(可相等),右边全是比他大的数(可相等),因此,就可以开始递归左边和右边,然后左边的左边和右边等等,当begin >= end时,就可以return了。

完整代码:

//快速排序
void QuickSort(int* a, int begin,int end)
{if (begin >= end)return;int keyi = begin;int l = begin;int r = end;while (l < r){while (l < r && a[r] >= a[keyi]){r--;}while (l < r && a[l] <= a[keyi]){l++;}Swap(&a[l], &a[r]);}Swap(&a[l], &a[keyi]);keyi = l; QuickSort(a, begin, keyi - 1);QuickSort(a, keyi + 1, end);
}

对代码进行优化,可以取最左、中、最右三个值取中间大小的值最为基准值keyi,可以提高排序的效率。

即:

int GetMidi(int* a, int begin, int end)
{int midi = (begin + end) / 2;// begin end midi三个数选中位数if (a[begin] < a[midi]){if (a[midi] < a[end])return midi;else if (a[begin] > a[end])return begin;elsereturn end;}else// a[begin] >= a[midi]{if (a[midi] > a[end])return midi;else if (a[begin] < a[end])return begin;elsereturn end;}
}
//快速排序
void QuickSort(int* a, int begin,int end)
{if (begin >= end)return;int midi = GetMidi(a, begin, end);Swap(&a[midi], &a[begin]);int keyi = begin;int l = begin;int r = end;while (l < r){while (l < r && a[r] >= a[keyi]){r--;}while (l < r && a[l] <= a[keyi]){l++;}Swap(&a[l], &a[r]);}Swap(&a[l], &a[keyi]);keyi = l; QuickSort(a, begin, keyi - 1);QuickSort(a, keyi + 1, end);
}

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

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

相关文章

ambari hive on Tez引擎一直卡住

hive on tez使用./bin/hive启动后一直卡住&#xff0c;无法进入命令行 使用TEZ作为Hive默认执行引擎时&#xff0c;需要在调用Hive CLI的时候启动YARN应用&#xff0c;预分配资源&#xff0c;这需要花一些时间&#xff0c;而使用MapReduce作为执行引擎时是在执行语句的时候才会…

iPaaS架构深入探讨

在数字化时代全面来临之际&#xff0c;企业正面临着前所未有的挑战与机遇。技术的迅猛发展与数字化转型正在彻底颠覆各行各业的格局&#xff0c;不断推动着企业迈向新的前程。然而&#xff0c;这一数字化时代亦衍生出一系列复杂而深奥的难题&#xff1a;各异系统之间数据孤岛、…

基于SuperMap iObjects Java生成地图瓦片

作者&#xff1a;dongyx 前言 在GIS领域&#xff0c;地图瓦片技术作为GIS领域的关键技术&#xff0c;是提高地图服务性能的关键手段之一。通过预先生成地图的瓦片数据&#xff0c;可以显著提升用户访问地图时的响应速度和体验。SuperMap iObjects for Java作为一款强大的GIS开…

Docker, Docker-compose部署Sonarqube

参考文档 镜像地址: https://hub.docker.com/_/sonarqube/tags Docker部署文档地址 Installing from Docker | SonarQube Docs Docker-compose文档部署地址&#xff1a; Installing from Docker | SonarQube Docs 部署镜像 2.1 docker部署 # 宿主机执行 $. vi /etc/sysctl.conf…

Java注解详解

概述 注解是对程序代码进行标注和解释的一种方式。在Java中&#xff0c;注解提供了一种元数据形式&#xff0c;能够在程序中嵌入有关程序的信息&#xff0c;以便进行进一步的处理。注解通过使用符号来声明&#xff0c;如Override、Deprecated等。 注解和注释的区别 注释&…

Unity中Batching优化的GPU实例化(4)

文章目录 前言一、构建需要实例化的额外数据二、在顶点着色器&#xff0c;将实例化 ID 从 appdata 存入 v2f 传给片元着色器三、在片断着色器中访问具体的实例化变量三、使用代码修改Shader材质属性&#xff0c;实现GPU实例化后不同对象颜色不同的效果1、在C#测试脚本生成小板凳…

ReactJs笔记摘录

前言 以前2018年搞过一段时间react antd开发&#xff0c;兜兜转转又回到react世界。 TODO中 Hook函数 JSX语法 根元素与斜杠 注意局部的jsx片段也要加根元素: return (<div>{items.map((item) > (// 此处只能有一个根元素!!!<>...<div className&quo…

要求CHATGPT高质量回答的艺术:提示工程技术的完整指南—第 23 章:命名实体识别提示

要求CHATGPT高质量回答的艺术&#xff1a;提示工程技术的完整指南—第 23 章&#xff1a;命名实体识别提示 命名实体识别&#xff08;NER&#xff09;是一种允许模型对文本中的命名实体&#xff08;如人物、组织、地点和日期&#xff09;进行识别和分类的技术。 要在 ChatGPT…

微前端介绍

目录 微前端概念 微前端特性 场景演示 微前端方案 iframe 方案 qiankun 方案 micro-app 方案 EMP 方案 无界微前端 方案 无界方案 成本低 速度快 原生隔离 功能强大 总结 前言&#xff1a;微前端已经是一个非常成熟的领域了&#xff0c;但开发者不管采用哪个现…

Leetcode—290.单词规律【简单】

2023每日刷题&#xff08;五十一&#xff09; Leetcode—290.单词规律 实现代码 class Solution { public:bool wordPattern(string pattern, string s) {unordered_map<char, string> m1;unordered_map<string, char> m2;stringstream stro(s);string tmp;for(a…

(env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序

应公司需求&#xff0c;在特定情况下需要修改ip 在开发过程中出现的小插曲 1、第一种情况&#xff1a;重复声明 2、第二种情况&#xff1a; 应官方要求&#xff0c;需要跳转的 tabBar 页面的路径&#xff08;需在 pages.json 的 tabBar 字段定义的页面&#xff09;&#xff0…

React中使用TypeScript代替prop-types

原文链接 公众号-React中使用TypeScript代替prop-types 个人公众号&#xff0c;呜呜呜&#xff0c;求各位大佬们关注下&#xff0c;本人的公众号主要写React 跟NodeJs的 ​关于prop-types 对于部分的同学&#xff0c;不大了解为什么我们的代码里面要用到prop-types这个库&a…

ArkTS快速入门

一、概述 ArkTS是鸿蒙生态的应用开发语言。它在保持TypeScript&#xff08;简称TS&#xff09;基本语法风格的基础上&#xff0c;对TS的动态类型特性施加更严格的约束&#xff0c;引入静态类型。同时&#xff0c;提供了声明式UI、状态管理等相应的能力&#xff0c;让开发者可以…

深度学习基础回顾

深度学习基础 浅层网络 VS 深层网络深度学习常用的激活函数Sigmoid 函数ReLU 函数Softplus 函数tanh函数 归纳偏置CNN适用数据归纳偏置 RNN适用数据归纳偏置 浅层网络 VS 深层网络 浅层神经网络参数过多&#xff0c;导致模型的复杂度和计算量很高&#xff0c;难以训练。而深层…

Redisson的基础使用(2)

布隆过滤器&#xff08;Bloom Filter&#xff09; 布隆过滤器一般用于解决缓存穿透的问题。主要原理是使用一组哈希函数&#xff0c;将元素映射成一组位数组中的索引位置。如果要检查某个元素是否在集合中时&#xff0c;将此元素通过所有的哈希函数&#xff0c;查看哈希值对应的…

硬件开发笔记(十五):RK3568底板电路VGA显示接口原理图分析

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/134849296 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

多态和继承复习

与其明天开始&#xff0c;不如现在行动&#xff01; 文章目录 多态多态成立的条件细节 继承&#x1f48e;总结 多态 多态成立的条件 存在继承关系或者实现关系子类重写父类的方法父类引用指向子类对象 细节 通过父类的引用调用子类的对象 Animal animal new Dog();animal…

C语言搭建项目-学生管理系统(非链表)

、 目录 搭建offer.h文件 搭建offer.c中的main函数 密码登入系统 搭建my_oferr.c中的接口函数 使用帮助菜单接口函数 增加学生信息接口函数 查询学生信息接口函数 删除学生信息接口函数 保存学生信息接口 打开文件fopen 关闭文件fclose 判断是否保存文件fwrite 退出执行文件…

C++:const类型数据的修改问题

在C语言中const类型的数据严格意义上可以修改&#xff1a; const int a1; int*b&a; *b2;不同于C语言&#xff0c;C中指针类型是要严格对应的&#xff0c;对const类型的数据必须使用const类型的指针进行接收&#xff0c;从而避免修改&#xff1b; 但问题是c中同样支持指针的…

年度工作总结怎么写?掌握这些年终总结万能公式,让你的报告出彩无比!

光阴似箭&#xff0c;日月如梭&#xff0c;时间总是不疾不徐地向前奔去&#xff0c;转眼就来到了2023年的最后一个月&#xff0c;12月一到&#xff0c;上班族和打工人又要开始忙活工作总结的事情~ 工作总结&#xff0c;不仅是一年工作的回顾&#xff0c;更是未来规划的起点。你…