主流排序简单集合

排序算法集合

选择排序

  • 图解:在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
  • 以此类推直至在这里插入图片描述
/*选择排序*/
void select_sort(vector<int>& nums) {
	/*选取一个基准元素逐个与后面的比较*/
	for (int i = 0; i < nums.size() - 1-1; i++) {
		int min = i;/*定义随之变化的基准元素*/
		for (int j = i + 1; j < nums.size() - 1; j++) {
			if (nums[i] > nums[j]) {
				swap(nums[i], nums[j]);//交换元素
			}
		}
	}
}

/* 选择排序 */  官方正解
void selectionSort(vector<int>& nums) {
	int n = nums.size();
	// 外循环:未排序区间为 [i, n-1]
	for (int i = 0; i < n - 1; i++) {
		// 内循环:找到未排序区间内的最小元素
		int k = i;
		for (int j = i + 1; j < n; j++) {
			if (nums[j] < nums[k])
				k = j; // 记录最小元素的索引
		}
		// 将该最小元素与未排序区间的首个元素交换
		swap(nums[i], nums[k]);
	}
}


冒泡排序(经典)

在这里插入图片描述

/* 冒泡排序 */
void bubbleSort(vector<int>& nums) {
	// 外循环:未排序区间为 [0, i]
	for (int i = nums.size() - 1; i > 0; i--) {
		// 内循环:将未排序区间 [0, i] 中的最大元素交换至该区间的最右端
		for (int j = 0; j < i; j++) {
			if (nums[j] > nums[j + 1]) {
				// 交换 nums[j] 与 nums[j + 1]
				// 这里使用了 std::swap() 函数
				swap(nums[j], nums[j + 1]);
			}
		}
	}
}

void test() {
	vector<int> nums = { 4,23,6,12,56,78,2,3,5,76 };
	//select_sort(nums);
	bubbleSort(nums);
	for (int num : nums) {
		cout << num << " ";
	}
}

插入排序

在这里插入图片描述在这里插入图片描述

/* 插入排序 */
void insertionSort(vector<int> &nums) {
    // 外循环:已排序区间为 [0, i-1]
    for (int i = 1; i < nums.size(); i++) {
        int base = nums[i], j = i - 1;
        // 内循环:将 base 插入到已排序区间 [0, i-1] 中的正确位置
        while (j >= 0 && nums[j] > base) {
            nums[j + 1] = nums[j]; // 将 nums[j] 向右移动一位
            j--;
        }
        nums[j + 1] = base; // 将 base 赋值到正确位置
    }
}

快速排序

重点理解反复熟悉
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

/* 元素交换 */
void swap(vector<int>& nums, int i, int j) {
	int tmp = nums[i];
	nums[i] = nums[j];
	nums[j] = tmp;
}

/* 哨兵划分 */
int partition(vector<int>& nums, int left, int right) {
	// 以 nums[left] 为基准数
	int i = left, j = right;
	while (i < j) {
		while (i < j && nums[j] >= nums[left])
			j--; // 从右向左找首个小于基准数的元素
		while (i < j && nums[i] <= nums[left])
			i++;          // 从左向右找首个大于基准数的元素
		swap(nums, i, j); // 交换这两个元素
	}
	swap(nums, i, left); // 将基准数交换至两子数组的分界线
	return i;            // 返回基准数的索引
}

/* 快速排序 */
void quickSort(vector<int>& nums, int left, int right) {
	// 子数组长度为 1 时终止递归
	if (left >= right)
		return;
	// 哨兵划分
	int pivot = partition(nums, left, right);
	// 递归左子数组、右子数组
	quickSort(nums, left, pivot - 1);
	quickSort(nums, pivot + 1, right);
}

堆排序

参考:数据结构之堆火烨烨在这里插入图片描述

#include <vector>
#include <iostream>
#include <algorithm> // 引入 swap 函数

using namespace std;

// 向下调整堆
void siftDown(vector<int>& nums, int n, int i) {
    while (true) {
        int l = 2 * i + 1;
        int r = 2 * i + 2;
        int ma = i;
        if (l < n && nums[l] > nums[ma])
            ma = l;
        if (r < n && nums[r] > nums[ma])
            ma = r;
        if (ma == i) {
            break;
        }
        swap(nums[i], nums[ma]);
        i = ma;
    }
}

/* 堆排序 */
void heapSort(vector<int>& nums) {
    int n = nums.size();
    // 建堆操作
    for (int i = n / 2 - 1; i >= 0; --i) {
        siftDown(nums, n, i);
    }
    // 提取最大元素并重新建堆
    for (int i = n - 1; i > 0; --i) {
        swap(nums[0], nums[i]);
        siftDown(nums, i, 0);
    }
}

int main() {
    vector<int> nums = { 10, 30, 40, 20, 100 };
    cout << "Before sorting: ";
    for (int num : nums) {
        cout << num << " ";
    }
    cout << endl;

    heapSort(nums);

    cout << "After sorting: ";
    for (int num : nums) {
        cout << num << " ";
    }
    cout << endl;

    return 0;
}

桶排序

在这里插入图片描述

/* 桶排序 */
void bucketSort(vector<float> &nums) {
    // 初始化 k = n/2 个桶,预期向每个桶分配 2 个元素
    int k = nums.size() / 2;
    vector<vector<float>> buckets(k);
    // 1. 将数组元素分配到各个桶中
    for (float num : nums) {
        // 输入数据范围为 [0, 1),使用 num * k 映射到索引范围 [0, k-1]
        int i = num * k;
        // 将 num 添加进桶 bucket_idx
        buckets[i].push_back(num);
    }
    // 2. 对各个桶执行排序
    for (vector<float> &bucket : buckets) {
        // 使用内置排序函数,也可以替换成其他排序算法
        sort(bucket.begin(), bucket.end());
    }
    // 3. 遍历桶合并结果
    int i = 0;
    for (vector<float> &bucket : buckets) {
        for (float num : bucket) {
            nums[i++] = num;
        }
    }
}

难点:归并排序在这里插入图片描述在这里插入图片描述在这里插入图片描述

实现

/* 合并左子数组和右子数组 */
void merge(vector<int> &nums, int left, int mid, int right) {
    // 左子数组区间为 [left, mid], 右子数组区间为 [mid+1, right]
    // 创建一个临时数组 tmp ,用于存放合并后的结果
    vector<int> tmp(right - left + 1);
    // 初始化左子数组和右子数组的起始索引
    int i = left, j = mid + 1, k = 0;
    // 当左右子数组都还有元素时,进行比较并将较小的元素复制到临时数组中
    while (i <= mid && j <= right) {
        if (nums[i] <= nums[j])
            tmp[k++] = nums[i++];
        else
            tmp[k++] = nums[j++];
    }
    // 将左子数组和右子数组的剩余元素复制到临时数组中
    while (i <= mid) {
        tmp[k++] = nums[i++];
    }
    while (j <= right) {
        tmp[k++] = nums[j++];
    }
    // 将临时数组 tmp 中的元素复制回原数组 nums 的对应区间
    for (k = 0; k < tmp.size(); k++) {
        nums[left + k] = tmp[k];
    }
}

/* 归并排序 */
void mergeSort(vector<int> &nums, int left, int right) {
    // 终止条件
    if (left >= right)
        return; // 当子数组长度为 1 时终止递归
    // 划分阶段
    int mid = (left + right) / 2;    // 计算中点
    mergeSort(nums, left, mid);      // 递归左子数组
    mergeSort(nums, mid + 1, right); // 递归右子数组
    // 合并阶段
    merge(nums, left, mid, right);
}

浅谈:

**好像人生在某一时期的青春过去之后时间的流逝变得始料未及的迅速,梦里不知身是客,一晌贪欢。就像古装台词描述的一样:俗世洪流,能够站得住脚就已经是千辛万苦。不知何时,对于某些理想性的事物的渴求也变得木讷了起来。当然,人们都喜欢向阳而生的少年/少女,尤其是久处黑夜的行路人,对于那爽朗的性格,明亮的笑容总是不由自主的喜欢与偏向。但是我的感觉总觉得人生不如意十有八九,身不由己,己不由心或许才是众生之态。好像这条路一眼可以望到尽头,可总充满不知所云的迷雾与诱惑。

依稀记得多年前看过一本书,刘同《你的孤独,虽败犹荣》当时并没有怎么仔细看,只是这名字很独特,感觉很有意思,竟然也默默记在心上。好多年后,走了也算多的路(虽然到现在也只是个迷途的旅客),见了很多的人,自然亦是失去了太多,不知竟也变得离经叛道起来。偶然间回忆起这本书,突然明白这书名的涵义。 你的孤独虽败犹荣!!!!就是当你已经选择了这条不被理解的道路,你是否有勇气走下去,有勇气坚定的走下去,是否做好了孤注一掷(虽说有些夸张,对于我等凡夫俗子),做好了接受失败的必然结局!就像感情中所失去的那样,

**很多年后,如果再给你一次机会,你会选择重新再来吗?**年少不可得之物终会困其一生,或许只是执念太过深沉,思维困在了自我的藩篱。但是,如果可以,你又会如何?你真愿意?你真的想清楚了吗? 我想人是感性的,不是坏事,也是难得,理性倒也十分需要,但是感性足以使得我们面对糟粕的世界本身。去年元夜时,花市灯如昼。 月上柳梢头,人约黄昏后。 今年元夜时,月与灯依旧。 不见去年人,泪湿春衫袖。

如果可以,可以在评论区留下你的遗憾,亦或是那个年少时曾照耀你的月光!!! 我的意思是,你值得珍藏过去,值得开拓未来!**

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

华为 2024 届校园招聘-硬件通⽤/单板开发——第一套(部分题目分享,完整版带答案,共十套)

华为 2024 届校园招聘-硬件通⽤/单板开发——第一套 部分题目分享&#xff0c;完整版带答案(有答案和解析&#xff0c;答案非官方&#xff0c;未仔细校正&#xff0c;仅供参考&#xff09;&#xff08;共十套&#xff09;获取&#xff08;WX:didadidadidida313&#xff0c;加我…

GEE:研究区(Polygon)样式设置

作者:CSDN @ _养乐多_ 本文将介绍在 Google Earth Engine (GEE)平台上为 polygon (面)数据设置样式的方法和代码,polygon 可以设置成任何颜色,以增加可视化效果更好理解数据分布。 结果如下图所示, 文章目录 一、统一样式1.1 示例代码1.2 示例代码链接二、根据区域名…

基于SpringBoot2.x、SpringCloud和SpringCloudAlibaba并采用前后端分离的企业级微服务多租户系统架构

简介 基于SpringBoot2.x、SpringCloud和SpringCloudAlibaba并采用前后端分离的企业级微服务多租户系统架构。并引入组件化的思想实现高内聚低耦合并且高度可配置化&#xff0c;适合学习和企业中使用。 真正实现了基于RBAC、jwt和oauth2的无状态统一权限认证的解决方案&#x…

element UI table合并单元格方法

废话不多讲&#xff0c;直接上代码&#xff0c;希望能帮到需要的朋友 // 合并单元格function spanMethod({ row, column, rowIndex, columnIndex }) {//定义需要合并的列字段&#xff0c;有哪些列需要合并&#xff0c;就自定义添加字段即可const fields [declareRegion] // …

hive-3.1.2分布式搭建与hive的三种交互方式

hive-3.1.2分布式搭建&#xff1a; 一、上传解压配置环境变量 在官网或者镜像站下载驱动包 华为云镜像站地址&#xff1a; hive&#xff1a;Index of apache-local/hive/hive-3.1.2 mysql驱动包&#xff1a;Index of mysql-local/Downloads/Connector-J # 1、解压 tar -zx…

采用Flink CDC操作SQL Server数据库获取增量变更数据

采用Flink CDC操作SQL Server数据库获取增量变更数据 Flink CDC 1.12版本引入了对SQL Server的支持&#xff0c;包括SqlServerCatalog和SqlServerTable。在SqlServerCatalog中&#xff0c;你可以根据表名获取对应的字段和字段类型。 SQL Server 2008 开始支持变更数据捕获 (C…

李廉洋:4.10黄金原油走势最新分析及策略。

美联储博斯蒂克重申了他对今年降息一次的预期&#xff0c;但他补充说&#xff0c;如果经济形势发生变化&#xff0c;他对推迟降息或进一步降息持开放态度。博斯蒂克强调了美国经济和劳动力市场的持续强劲&#xff0c;但表示就业市场的疲软迹象将促使他考虑比目前预期的更早和更…

GFS部署实验

目录 1、部署环境 ​编辑 2、更改节点名称 3、准备环境 4、磁盘分区&#xff0c;并挂载 5. 做主机映射--/etc/hosts/ 6. 复制脚本文件 7. 执行脚本完成分区 8. 安装客户端软件 1. 安装解压源包 2. 创建gfs 3. 安装 gfs 4. 开启服务 9、 添加节点到存储信任池中 1…

SVM向量支持机

1.通俗理解 svm&#xff1a;support vector machine目标&#xff1a;利用超平面将两类数据分割开来&#xff0c;这个超平面就是我们要设计的对象 如何设计&#xff1f;我们设计之后会有间隔&#xff0c;间隔越大分类效果就越好&#xff1b;距离决策边界最近的点我们成为支持向…

40.Python从入门到精通—Python3 JSON 数据解析 Python3 日期和时间 什么是时间元组? 获取当前时间 获取格式化的时间

40.Python从入门到精通—Python3 JSON 数据解析 Python3 日期和时间 什么是时间元组&#xff1f; 获取当前时间 获取格式化的时间 Python3 JSON 数据解析Python3 日期和时间什么是时间元组&#xff1f;获取当前时间获取格式化的时间 Python3 JSON 数据解析 Python3 中可以使用…

使用MongoDB 构建AI:轻松应对从预测式AI到生成式AI

毫无疑问&#xff0c;如今从生成式AI (GenAI )中获益最大的&#xff0c;是那些早已运用预测式AI (Predictive AI )的组织。 2023年6月&#xff0c;麦肯锡在2023年6月发布的《生成式人工智能的经济潜力》研究中也得出了与此相同的结论。 原因主要有以下几点&#xff1a; 内部文…

顺序表(C语言实现)

什么是顺序表 顺序表和数组的区别 顺序表本质就是数组 结构体初阶进阶 系统化的学习-CSDN博客 简单解释一下&#xff0c;就像大家去吃饭&#xff0c;然后左边是苍蝇馆子&#xff0c;右边是修饰过的苍蝇馆子&#xff0c;但是那个好看的苍蝇馆子一看&#xff0c;这不行啊&a…

Harmony鸿蒙南向驱动开发-MIPI CSI

CSI&#xff08;Camera Serial Interface&#xff09;是由MIPI联盟下Camera工作组指定的接口标准。CSI-2是MIPI CSI第二版&#xff0c;主要由应用层、协议层、物理层组成&#xff0c;最大支持4通道数据传输、单线传输速度高达1Gb/s。 物理层支持HS&#xff08;High Speed&…

kettle经验篇:取出一个字符串中的两个数值

项目场景 在一个数据清洗、同步的需求中&#xff1b;有一个要求是判断两个数值是否在正常范围内&#xff0c;并根据判断结果给出异常标记。但这两个数值是以XML的格式存储在Oracle的CLOB字段中&#xff0c;且在同一个XML节点中。该节点的内容如下: "OD: 17.4 mmHg O…

2024Peak码支付系统网站源码

系统简介 Peak码支付-是专为个人站长打造的聚合免签系统&#xff0c;拥有卓越的性能和丰富的功能。用全新轻量化的界面UI&#xff0c;让您可以更加方便快捷地解决知识付费和运营赞助的难题。同时&#xff0c;它基于高性能SpeedPHPLayuiPearAdmin架构&#xff0c;提供实时监控和…

https的配置和使用(以腾讯云为例)

1、注册域名 2、获取证书 3、下载证书 下载下来的证书所有格式 4、在服务器上下载nginx并配置 nginx的配置文件 如下 server {listen 80;listen 443 ssl;server_name delegate.letspiu.net.cn;ssl on; #开启ssl#指定证书位置ssl_certificate /etc/ss…

低代码ARM计算机在IIoT中的采集控制生产面板

工业4.0的大潮下工业物联网&#xff08;IIoT&#xff09;已成为推动制造业转型升级的重要动力。其中&#xff0c;低代码ARM嵌入式计算机凭借其出色的性能、灵活的配置以及高度集成化的特点&#xff0c;在工业设备远程监控、维护与诊断方面发挥着关键作用。 一、远程监控与维护 …

【配电网故障定位】基于二进制蝗虫优化算法的配电网故障定位 12节点配电系统故障定位【Matlab代码#75】

文章目录 【获取资源请见文章第5节&#xff1a;资源获取】1. 配电网故障定位2. 二进制蝗虫优化算法3. 部分代码展示4. 仿真结果展示5. 资源获取 【获取资源请见文章第5节&#xff1a;资源获取】 1. 配电网故障定位 配电系统故障定位&#xff0c;即在配电网络发生故障的时候&am…

ArcGIS Server 10发布要素服务时遇到的数据库注册问题总结(一)

工作环境&#xff1a; Windows 7 64 位旗舰版 ArcGIS Server 10.1 ArcGIS Desktop 10.1 IIS 7.0 开始的时候以为10.1发布要素服务和10.0一样&#xff0c;需要安装ArcSDE&#xff0c;后来查阅资料发现不需要&#xff0c;数据库直连方式就可以了。 首先我来说一下发布要素服…

用Wireshark工具对gRPC接口进行本地抓包

前言&#xff1a; 本人一名敲代码的程序员&#xff0c;突然领导安排研究gRPC接口&#xff0c;并且抓包分析&#xff0c; 抓包工具试了Charles、mitmproxy都不行&#xff0c;浪费很多时间&#xff0c;最后使用Wireshark工具对本地启动的gRPC接口成功抓包&#xff0c;关于安装W…