数据结构八种内部排序算法c++实现

文章目录

  1. 直接插入排序
  2. 希尔排序
  3. 冒泡排序
  4. 快速排序
  5. 选择排序
  6. 堆排序
  7. 归并排序
  8. 桶排序

直接插入排序

vector<int> insertSort(vector<int> num)
{int i, j, temp;for (i = 1; i < num.size(); i++){temp = num[i];for (j = i - 1; j >= 0 && temp<num[j]; j--)//易错点,&&前后不可拆分为if语句,这是一个连续的循环{num[j + 1] = num[j];}num[j + 1] = temp;}return num;
}

希尔排序

vector<int> shellSort(vector<int> num)
{int i, j, temp;int n = num.size();for (int gap = n / 2; gap > 0; gap = gap / 2)//增量设置的边界条件不能等于0{for (i = gap; i < n; i++){temp = num[i];for (j = i - gap; j >= 0 && temp<num[j]; j -= gap)num[j + gap] = num[j];num[j + gap] = temp;}}return num;}

冒泡排序

vector<int> bubbleSort(vector<int> num)
{int n = num.size();for (int i = 0; i < n; i++){bool flag = false;for (int j = 0; j < n - i - 1; j++){if (num[j + 1] < num[j]){swap(num[j], num[j + 1]);flag = true;}}if (!flag)break;}return num;
}

快速排序

int paratition(vector<int>& num, int low, int high)
{int base = num[low];//选择基准元素while (low < high){//num[high] >= base中的=判断不能省略while (num[high] >= base  && low < high   ) high--;//该循环跳出语句中&&前后衔接可互换,但由于&&的短路特性,更建议先判断low<highnum[low] = num[high];while (low < high && num[low] <= base ) low++;num[high] = num[low];}num[low] = base;return low;
}void quickSort(vector<int>& num,int low,int high)
{if (low < high)//该语句不可少,只有在low<high时的交换才起作用,否则在递归时会出现错误{int j = paratition(num, low, high);quickSort(num, low, j - 1);quickSort(num, j + 1, high);}}

选择排序

vector<int> selectSort(vector<int> num)
{int n = num.size();for (int i = 0; i < n; i++){int min = i;for (int j = i + 1; j < n; j++){if (num[j] < num[min]){min = j;}}if (min != i){swap(num[min], num[i]);}}return num;
}

堆排序

void heapAdjust(vector<int>& num, int p, int n)
{int temp = num[p];//取出根节点,待找到该根节点的子树中最大的节点之后与该根节点进行交换for (int i = 2 * p + 1; i < n; i = 2*i+1)//遍历子树,寻找最大节点{if (i + 1 < n && num[i + 1] > num[i]) i++;//首先比较父节点的两个孩子的最大值if (temp >= num[i]) break;//如果父节点比两个孩子节点都大,则不需要交换,说明当前子树已经是大根堆num[p] = num[i];//将最大孩子进行上移为父节点p = i;//继续遍历子树,保证其子树也是大根堆}num[p] = temp;
}
void heapSort(vector<int>& num)
{//构建初始大根堆int n = num.size();for (int i = n / 2 - 1; i >= 0; i--)//从最后一个非叶子节点向上构造大根堆heapAdjust(num, i, n);for (int j = n - 1; j >= 0; j--){//大根堆的第一个数字是最大的,将大根与最后一个数字进行交换,则该数组的最后一个数一定是最大的swap(num[0], num[j]);//将数组长度减去1后,调整堆,重新进行交换heapAdjust(num, 0, j);}}

归并排序

void merge(vector<int>& num, int low, int mid, int high)
{vector<int> help;//定义辅助数组help.resize(high - low + 1);int i = low, j = mid + 1, k = 0;//i为第一序列的扫描指针,j为第二序列的扫描指针,k为辅助数组的扫描指针while (i <= mid && j <= high)// = 不能省略{if (num[i] < num[j]) help[k++] = num[i++];else help[k++] = num[j++];}while (i <= mid) help[k++] = num[i++];while (j <= high) help[k++] = num[j++];for (int i = low, k = 0; i <= high; i++, k++){num[i] = help[k];}
}void mergeSort(vector<int>& num, int low, int high)
{if (low == high)//递归跳出条件,即当子序列长度为1时终止递归return;int mid = (low + high) / 2;mergeSort(num, low, mid);//递归划分左区间,直到区间序列个数为1时终止递归mergeSort(num, mid + 1, high);//递归划分右区间,知道区间序列个数为1时终止递归merge(num, low, mid, high);//合并
}

桶排序

定义一个编号为[0,max]的桶,其中max为待排序数组当中的最大值
遍历数组,将数组的中的元素值放到该元素对应编号的桶中,桶数组的值代表放入桶中的个数,初始时桶中个数为0
按照桶的编号顺序依次取出桶中的元素
//桶排序
void bucketSort(vector<int>& nums) 
{//思想:int n = nums.size();int max=0;for (int i = 0; i < n; i++){if (nums[i] > max)max = nums[i];}vector<int> bucket(max+1, 0);//初始化桶for (int i = 0; i < n; i++)//将数组中的数放到对应编号的桶中bucket[nums[i]]++;for (int i = 0,j=0; i <= max; i++){while (bucket[i]--> 0)nums[j++] = i;}
}

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

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

相关文章

mysqldump常用操作示例/命令

以下是一些常用的mysqldump操作示例&#xff0c;以备份和还原MySQL数据库为例&#xff1a; 1. 备份单个数据库&#xff1a; mysqldump -u your_username -p your_password your_database > backup.sql将 your_username 替换为你的MySQL用户名&#xff0c;your_password 替…

反序列化漏洞(1), 原理, 实验, 魔术方法

反序列化漏洞(1), 原理, 实验, 魔术方法 一, 介绍 反序列化漏洞是一种存在于反序列化过程中的漏洞&#xff0c;它允许攻击者通过控制反序列化的数据来操纵序列化对象&#xff0c;并将有害数据传递给应用程序代码。 这种漏洞可能造成代码执行、获取系统权限等一系列不可控的后…

【ES6标准入门】JavaScript中的模块Module的加载实现:循环加载和Node加载,非常详细,建议收藏!!!

&#x1f601; 作者简介&#xff1a;一名大四的学生&#xff0c;致力学习前端开发技术 ⭐️个人主页&#xff1a;夜宵饽饽的主页 ❔ 系列专栏&#xff1a;JavaScript进阶指南 &#x1f450;学习格言&#xff1a;成功不是终点&#xff0c;失败也并非末日&#xff0c;最重要的是继…

IDEA写mybatis程序,java.io.IOException:Could not find resource mybatis-config.xml

找不到mybatis-config.xml 尝试maven idea:module&#xff0c;不是模块构造问题 尝试检验pom.xml&#xff0c;在编译模块添加了解析resources内容依旧不行 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.or…

chrome 浏览器个别字体模糊不清

特别是在虚拟机里&#xff0c;有些字体看不清&#xff0c;但是有些就可以&#xff0c;设置办法&#xff1a; chrome://settings/fonts 这里明显可以看到有些字体就是模糊的状态&#xff1a; 把这种模糊的字体换掉即可解决一部分问题。 另外&#xff0c;经过观察&#xff0c;…

【C++】数组中出现次数超过一半的数字

代码&#xff1a; class Solution { public:/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** * param numbers int整型vector * return int整型*/int MoreThanHalfNum_Solution(vector<int>& numbers) {int …

h5(react ts 适配)

一、新建项目并放在码云托管 1、新建项目&#xff1a;react ts h5 考虑到这些 用 create-react-app 脚手架来搭建项目。 首先&#xff0c;确保你已经安装了 Node.js。如果没有安装&#xff0c;请先从官方网站 https://nodejs.org/ 下载并安装 Node.js。打开命令行工具&#x…

vue3 + ts项目(无vite)报错记录

记录项目创建后遇到的报错 1.类型“Window & typeof globalThis”上不存在属性“_CONFIG”。ts(2339) 问题描述&#xff1a; 使用全局 window 上自定义的属性&#xff0c;TypeScript 会报属性不存在 解决&#xff1a;需要将自定义变量扩展到全局 window 上&#xff0c…

word文档转换为ppt文件,怎么做?

大家是否会遇到需要将word文档转换为ppt文件的情况&#xff1f;除了反反复复粘贴复制以外&#xff0c;还有其他方法可以转换文件格式&#xff0c;今天给大家分享word转换ppt方法。 首先我们先将word文件打开大纲模式 然后我们将文中的大标题设置为1级标题&#xff0c;副标题设…

服务器集群配置LDAP统一认证高可用集群(配置tsl安全链接)-centos9stream-openldap2.6.2

写在前面 因之前集群为centos6&#xff0c;已经很久没升级了&#xff0c;所以这次配置统一用户认证也是伴随系统升级到centos9时一起做的配套升级。新版的openldap配置大致与老版本比较相似&#xff0c;但有些地方配置还是有变化&#xff0c;另外&#xff0c;铺天盖地的帮助文…

已安装的nginx追加ssl模块

Nginx开启SSL模块1 切换到源码包&#xff1a; cd /usr/local/src/nginx-1.11.3 2 查看nginx原有的模块 /usr/local/nginx/sbin/nginx -V 在configure arguments:后面显示的原有的configure参数如下&#xff1a; –prefix/usr/local/nginx --with-http_stub_status_module …

C/C++高频面经-秋招篇

自己在秋招找工作过程中遇到的一些C/C面试题&#xff0c;大中小厂都有&#xff0c;分享出来&#xff0c;希望能帮到有缘人。 C语言 snprintf()的使用 函数原型为int snprintf(char *str, size_t size, const char *format, …) 两点注意&#xff1a; (1) 如果格式化后的字符…

对于koa中间件的理解

洋葱模型 大家都知道koa是洋葱模型&#xff0c;先一层一层通过next往下&#xff0c;之后再回去执行next后面的内容&#xff0c;next即使没写&#xff0c;最后也会进入下一个中间件。 那么什么是ctx呢&#xff0c;ctx顾名思义就是上下文&#xff0c;也就是上一层传给下一层的东…

【广州华锐互动】消防安全宣传知识3D交互展示提升公众学习沉浸感

随着科技的快速发展&#xff0c;我们的生活与工作环境愈发复杂&#xff0c;火灾风险也随之提高。为了提高公众的消防灭火能力&#xff0c;普及消防安全知识&#xff0c;广州华锐互动开发了消防安全宣传知识3D交互展示系统。 这是一种全新的教育方式&#xff0c;它利用3D技术&am…

【EI会议征稿】第三届图像,信号处理与模式识别国际学术会议(ISPP 2024)

第三届图像&#xff0c;信号处理与模式识别国际学术会议&#xff08;ISPP 2024) 2024 3rd International Conference on Image, Signal Processing and Pattern Recognition&#xff08;ISPP 2024&#xff09; 第三届图像&#xff0c;信号处理与模式识别国际学术会议&#xf…

WPF的总体架构、类对象结构介绍

一、WPF总体结构 Windows Presentation Foundation (WPF) 是 Microsoft .NET Framework 的一部分&#xff0c;用于构建丰富的桌面应用程序。它提供了一种统一的编程模型&#xff0c;用于构建现代的用户界面。 以下是 WPF 的主要组件和其关系&#xff1a; PresentationFramewo…

Cow Lineup S——离散化、单调队列、双指针

题目描述 思路 x、id不大于1亿&#xff0c;数据量太大&#xff0c;使用离散化将id离散化成一串从1开始连续的编号&#xff0c;使用map集合进行离散化使用双指针维护一段区间&#xff0c;这段区间满足每个编号都包含 如何使用map集合进行离散化&#xff1f; 维护一个变量nums…

工业镜头中的远心镜头与普通镜头的光路

普通镜头&#xff1a; 主光线与镜头光轴有角度&#xff0c;工件上下移动时&#xff0c;像的大小有变化。 FOV&#xff1e;镜头前端直径。 物方远心镜头&#xff1a; 物方主光线平行于光轴&#xff0c;物距发生改变时&#xff0c;像高不会发生改变&#xff0c;测得的物体尺寸大…

Redis缓存穿透、击穿、雪崩

一、Redis的缓存穿透 1.什么是缓存穿透&#xff1f; 缓存穿透是指&#xff1a;客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这时缓存就永远不会生效&#xff0c;这些请求都打到数据库从而导致数据库压力过大。 2.出现缓存穿透的解决方案&#xff0c;以下是常用的两…

redis运维(五)再探redis

一 redis概述 ① redis简介 redis三大特性&#xff1a; 缓存、分布式内存数据库、持久化说明&#xff1a;非必须不建议在redis终端操作 ② redis亮点 ③ 初露锋芒 redis-benchmark redis-benchmark并发压力测试的问题解析 备注&#xff1a;多次测试取平均值,最好在物理机…