c++实现常见排序算法

  1. 常见算法效率比较
    在这里插入图片描述

  2. 冒泡排序:依次比较相邻数据并根据排序规则交换;

  3. 插入排序:将当前元素插入到当前元素之前的所有元素的最后一个大于/小于的位置,其他位置元素依次向后移动;

  4. 选择排序:对于每个位置,选择剩余元素最小/最大的元素;

  5. 希尔排序:使用gap = N /2,将相邻gap的元素进行比较和交换,之后不断缩小gap,gap = 1时停止;

  6. 快速排序:使用povit元素作为基准,将小的元素放在基准左边,大于的元素放入基准右边;

  7. 归并排序:递归思想,借助新的数组;

代码实现:

#include <iostream>
#include <vector>
using namespace std;
//快速排序
void fastSort(vector<int> &nums, int l, int r)
{if (l < r){int left = l;int right = r;int pivot = nums[left];while (left < right){// 从右向左找到第一个小于pivot值元素做替换while (left < right && nums[right] >= nums[left]){right--;}nums[left] = nums[right];// 从左向右查找第一个大于pivot的元素while (left < right && nums[left] <= nums[right]){left++;}nums[right] = nums[left];}//left == rightnums[left] = pivot;fastSort(nums, l, left - 1);fastSort(nums, left + 1, r);}
}//冒泡排序
void dubbleSort(vector<int> &nums)
{int n = nums.size();for(int i = 0;i < n-1;i++){for(int j = i + 1;j < n;j++){if(nums[i] > nums[j]){int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}}}
}//插入排序
void insertSort(vector<int> &nums)
{for(int i = 1;i < nums.size();i++){int cur = nums[i];int pos = i-1;while(pos >= 0 && cur < nums[pos]){nums[pos + 1] = nums[pos];pos--;}nums[pos + 1] = cur; }
}//选择排序
void selectSort(vector<int> &nums)
{for(int i = 0;i < nums.size()-1;i++){int minPos = i;for(int j = i;j < nums.size();j++){if(nums[j] < nums[minPos]){minPos = j;}}//交换int temp = nums[minPos];nums[minPos] = nums[i];nums[i] = temp;}
}//希尔排序
void shellSort(vector<int> &nums)
{int gap = nums.size() / 2;while(gap > 0){for(int i = gap;i < nums.size();i++){int j = i;while(j >= gap && nums[j] < nums[j-gap]){int temp = nums[j];nums[j] = nums[j-gap];nums[j-gap] = temp;j = j - gap;}}gap /= 2;}
}//归并排序
void merge(vector<int> &nums,int left,int right)
{vector<int> temp(nums.size());int mid = left + (right - left) / 2;int p = left;int q = mid + 1;int k = left;//新数组指针while(p <= mid && q <= right){if(nums[p] <= nums[q]){temp[k++] = nums[p++];}else{temp[k++] = nums[q++];}}while(p <= mid){temp[k++] = nums[p++];}while(q <= right){temp[k++] = nums[q++];}for(int i = left;i <= right;i++){nums[i] = temp[i];}}
void mergeSort(vector<int> &nums,int left,int right)
{if(left < right){int mid = left + (right - left) / 2;mergeSort(nums,left,mid);mergeSort(nums,mid+1,right);merge(nums,left,right);}
}
int main()
{vector<int> nums = {3, 2, 3, 1, 2, 4, 5, 5, 6};//快速排序fastSort(nums, 0, nums.size() - 1);//冒泡排序dubbleSort(nums);//插入排序insertSort(nums);//选择排序selectSort(nums);//希尔排序shellSort(nums);//归并排序mergeSort(nums,0,nums.size()-1);//输出结构for(auto a : nums){cout << a << " ";}return 0;
}

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

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

相关文章

Azure Private endpoint DNS 记录是如何解析的

Private endpoint 从本质上来说是Azure 服务在Azure 虚拟网络中安插的一张带私有地址的网卡。 举例来说如果Storage account在没有绑定private endpoint之前&#xff0c;查询Storage account的DNS记录会是如下情况&#xff1a; Seq Name …

【Linux 基础】常用基础指令(上)

文章目录 一、 创建新用户并设置密码二、ls指令ls指令基本概念ls指令的简写操作 三、pwd指令四、cd指令五、touch指令六、rm指令七、mkdir指令八、rmdir 指令 一、 创建新用户并设置密码 ls /home —— 查看存在多少用户 whoami —— 查看当前用户名 adduser 用户名 —— 创建新…

巨杉数据库携手广发证券入选2023大数据“星河”案例

近期&#xff0c;中国信息通信研究院、中国通信标准化协会大数据技术标准推进委员会(CCSA TC601)连续七年共同组织的大数据“星河&#xff08;Galaxy&#xff09;”案例征集活动发布公示。本次征集活动&#xff0c;旨在通过总结和推广大数据产业发展的优秀成果&#xff0c;推动…

Jenkins邮件推送配置

目录 涉及Jenkins插件&#xff1a; 邮箱配置 什么是授权码 在第三方客户端/服务怎么设置 IMAP/SMTP 设置方法 POP3/SMTP 设置方法 获取授权码&#xff1a; Jenkins配置 从Jenkins主面板System configuration>System进入邮箱配置 在Email Extension Plugin 邮箱插件…

1.22ABM仿真(netlogo),A*(简要)

NETLOGO ABM建模 A* &#xff0c;体现了当前的步数成本 H为启发值&#xff0c;由启发性公式决定&#xff0c; 就是成本F由两个要素确定&#xff0c;一个是实际位置的成本G&#xff0c;由其自身固定的地理位置决定&#xff0c;另一个是启发值H&#xff0c;由下一个位置与目标…

【学网攻】 第(10)节 -- 路由器单臂路由配置

系列文章目录 目录 系列文章目录 文章目录 前言 一、单臂路由是什么&#xff1f; 二、实验 1.引入 实验拓扑图 PC配置 Sw配置 Router配置 实验验证 总结 文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用【学网攻】 第(3)节 -- 交…

记签名机制

签名过程&#xff1a; 首先将数据源通过摘要算法获取到数字摘要 对数字摘要用私钥进行加密得到签名 将原始消息 以及签名发送给消息接收方 接收方用公钥解密得到数字摘要 用同样的摘要算法将原始消息进行计算 比较得到的数字摘要与解密后的是否一致 Android学习笔记——Androi…

Linux 驱动开发基础知识—— LED 驱动程序框架(四)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…

Oracle RAC 集群的安装(保姆级教程)

文章目录 一、安装前的规划1、系统规划2、网络规划3、存储规划 二、主机配置1、Linux主机安装&#xff08;rac01&rac02&#xff09;2、配置yum源并安装依赖包&#xff08;rac01&rac02&#xff09;3、网络配置&#xff08;rac01&rac02&#xff09;4、存储配置&#…

一款强大的矢量图形设计软件:Adobe Illustrator 2023 (AI2023)软件介绍

Adobe Illustrator 2023 (AI2023) 是一款强大的矢量图形设计软件&#xff0c;为设计师提供了无限创意和畅行无阻的设计体验。AI2023具备丰富的功能和工具&#xff0c;让用户可以轻松创建精美的矢量图形、插图、徽标和其他设计作品。 AI2023在界面和用户体验方面进行了全面升级…

深入理解stress/stress-ng

文章目录 一、概述二、安装2.1、源码编译安装2.2、命令行安装2.3、安装确认 三、重要参数详解3.1、查询支持的参数3.2、重要参数说明 四、实例4.1、压测CPU4.2、压测内存4.3、压测IO4.4、压测磁盘及IO4.5、压测磁盘及CPU 团队博客: 汽车电子社区 一、概述 stress是一种工作负载…

[docker] Docker的私有仓库部署——Harbor

一、Docker原生私有仓库—— Registry 1.1 Registry的简单了解 关于Docker的仓库分为私有库和公有仓库&#xff0c;共有仓库只要在官方注册用户&#xff0c;登录即可使用。但对于仓库的使用&#xff0c;企业还是会有自己的专属镜像&#xff0c;所以私有库的搭建也是很有必要的…