排序算法——梳理总结

news2024/11/18 5:51:43

✨冒泡
✨选择
✨插入
 ✨标准写法
 🎭不同写法
✨希尔排序——标准写法
✨快排
✨归并
✨堆排

在这里插入图片描述

冒泡

在这里插入图片描述

void Bubble(vector<int>& nums)
{
	// 冒泡排序只能先确定最右边的结果,不能先确定最左边的结果
	for (int i = 0; i < nums.size(); i++)
	{
	// 确定的右边的就不用排了并且不能让j+1越界
	// 所以判断条件是nums.size()-i - 1
		for (int j = 0; j < nums.size()-i - 1; j++)
			if (nums[j] > nums[j + 1])
				swap(nums[j], nums[j + 1]);
	}
}

选择

选择排序重要的是选,先选出来,再将这个数交换进去
在这里插入图片描述

void Select(vector<int>& nums)
{
	for (int i = 0; i < nums.size(); i++)
	{
		int t = i;// 记录需要交换的数的位置
		for (int j = i + 1; j < nums.size(); j++)
			if (nums[t] > nums[j])
				t = j;
		swap(nums[t], nums[i]);
	}
}

插入

在这里插入图片描述

标准写法

插入排序是一个一个往后挪,最后再插入

void Insert(vector<int>& nums)
{
	for (int i = 0; i < nums.size(); i++)
	{
		int t = nums[i];
		// 注意j表示需要检查的位置,这个位置必须遵循j>=0
		for (int j =i-1; j >= 0; j--)
		{
			if (nums[j] > t)
				nums[j + 1] = nums[j];
			else
			{
				nums[j + 1] = t;
				break;
			}
		}
	}
}

注意j的范围

🎭不同写法

这种写法类似于冒泡排序,他是往前冒,虽然能对,但是这已经不是插入排序的思想

int* sortArray(int* nums, int numsSize, int* returnSize)
{
    //插入排序:在已经排好序的数组中进行插入
    *returnSize=numsSize;
    for(int i=0;i<numsSize;i++)
    {
        //从此位置向前比
        for(int j=i;j>0;j--)
        {
            if(nums[j]<nums[j-1])
            {
                int tem=nums[j];
                nums[j]=nums[j-1];
                nums[j-1]=tem;
            }
            else
            break;
        }
    }
    return nums;
}

希尔——标准写法

在这里插入图片描述

希尔排序是在插入排序的基础上发展而来,所以要遵循插入排序的逻辑
他和插入排序不同在于,插入排序的gap=1,这个gap是从大到小变化

void Shell(vector<int>& nums)
{
	for (int gap = nums.size()/2; gap >0; gap/=2)// 间隔	
	{
	//每次向后跳间隔个长度
		for (int i = 0; i < nums.size(); i++) 
		{
			int t = nums[i];
			// 注意j的范围
			for (int j = i-gap; j >= 0; j -= gap)
			{
				if (nums[j] > t)
					nums[j + gap] = nums[j];
				else
				{
					nums[j + gap] = t;
					break;
				}
			}

		}
	}
}

注意j的范围


快排

我们使用三段式进行排序
[l,left] [left+1,right-1] [right,r]
[l,left]——小于key
[left + 1 , right-1]—— 等于key,等于key的是不用排序
[right , r]——大于key

int getNum(vector<int>& nums, int l, int r)
{
	srand(time(nullptr));
	return nums[l + rand() % (r - l + 1)];
}
void quicksort(vector<int>& nums, int l, int r)
{
	if (l >= r) return;
	int key = getNum(nums, l, r);
	int left = l - 1, right = r + 1, g = l;// 采用三段式进行
	while (g < right)
	{
		if (nums[g] == key) g++;
		else if (nums[g] < key) swap(nums[g++], nums[++left]);
		else swap(nums[g], nums[--right]);
	}
	// [l,left][left+1,right-1][right,r]
	quicksort(nums, l, left), quicksort(nums, right, r);
}

归并

归并排序需要一个辅助数组,我们使用的是vector,使用之前需要进行resize,开足够大的空间的同时要运行进行随机访问

vector<int> tem;
void mergesort(vector<int>& nums, int l, int r)
{
	if (l >= r) return;
	int mid = l + r >> 1;
	mergesort(nums, l, mid), mergesort(nums, mid + 1, r);
	int left = l, right = mid + 1;
	int t = 0;
	while (left <= mid && right <= r)
	{
		if (nums[left] < nums[right]) tem[t++] = nums[left++];
		else tem[t++] = nums[right++];
	}
	while (left <= mid) tem[t++] = nums[left++];
	while (right <= r) tem[t++] = nums[right++];
	t = 0;
	left = l;
	while (left <= r) nums[left++] = tem[t++];
}

堆排

void up(vector<int>& nums,int t)
{
	while (t > 0)
	{
		int parent = (t - 1) / 2;
		// 大根堆
		if (nums[parent] < nums[t])
			swap(nums[parent], nums[t]);
		t = parent;
	}
}
void down(vector<int>& nums,int t)
{
	// 需要从这个位置开始向下down到底
	int child = t * 2 + 1;
	while (child < nums.size())
	{
		// 找到左右孩子中最小的位置
		//if (child + 1 < nums.size() && nums[child] > nums[child + 1])
		//	child++;
		//if(nums[t]>nums[child]) 
		//	swap(nums[t], nums[child]);

		if (child + 1 < nums.size() && nums[child] < nums[child + 1]) child++;
		if (nums[t] < nums[child])
			swap(nums[t], nums[child]);
		t = child;
		child = t * 2 + 1;
	}
}
void Heap(vector<int>& nums)
{
	 //筛选法建立初始堆——小大根堆都可以
	//for (int i = nums.size()/2; i >= 0; i--) down(nums, i);
	//for (int i = 0 ; i < nums.size(); i++) up(nums, i);// 如果想用up初始化堆,只能从头开始
}
  1. 筛选法建堆——先将所有数据加入构成堆,在从中间位置开始进行down(只能down,不论是建大堆还是小堆)
    什么时候使用up,为什么up不能在筛选法建堆中使用
    请添加图片描述
    就像上图中的情况,在建小堆的过程中,2是一定不能访问到的,就不能建成小堆,所以不能在筛选法中使用up(关键是筛选法起点是中间位置)
    如果想使用up,必须将每一个进行up,或者是某个位置上面的已经成堆,那么就可以在这个位置直接使用up
    对于down来说,如果某个位置下面已经成堆,那么就可以直接使用down

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

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

相关文章

1.2_2 OSI参考模型

文章目录 1.2_2 OSI参考模型一、概述&#xff08;一&#xff09;ISO/OSI参考模型是怎么来的&#xff1f;&#xff08;二&#xff09;ISO/OSI参考模型&#xff08;三&#xff09;ISO/OSI参考模型解释通信过程 二、各层功能及协议&#xff08;一&#xff09;应用层&#xff08;第…

微服务day06-Docker

Docker 大型项目组件较多&#xff0c;运行环境也较为复杂&#xff0c;部署时会碰到一些问题&#xff1a; 依赖关系复杂&#xff0c;容易出现兼容性问题 开发、测试、生产环境有差异 1.什么是Docker? 大型项目组件很多&#xff0c;运行环境复杂&#xff0c;部署时会遇到各种…

java集合类常用的方法介绍

在 Java 中&#xff0c;集合&#xff08;Collections&#xff09;是用于存储多个元素的容器。Java Collections Framework 提供了丰富的集合类&#xff0c;用于满足不同的数据存储需求。以下是一些常用的 Java 集合类及其常用方法&#xff0c;以及简单的例子来说明它们的用法。…

最佳牛围栏(二分 + 前缀和)

最佳牛围栏 原题链接&#xff1a;https://www.acwing.com/problem/content/104/ 题目 思路 我们发现若是枚举答案的话&#xff0c;那么我们判断是否存在一个平均值大于等于mid&#xff0c;如果最优解是x&#xff0c;那么mid < x的时候&#xff0c;必然可以找到一段&#x…

【文件增量备份系统】使用Mysql的流式查询优化数据清理性能(针对百万量级数据)

文章目录 功能介绍原始方案测试 流式处理测试 功能可用性测试 功能介绍 清理功能的作用是&#xff1a;扫描数据库中已经备份过的文件&#xff0c;查看数据源中是否还有相应的文件&#xff0c;如果没有&#xff0c;说明该文件被删除了&#xff0c;那相应的&#xff0c;也需要将…

buuctf EasyBypass --不会编程的崽

buu后边的题有些确实难&#xff0c;有些其实也没那么复杂。昨天做一道异或绕过的题&#xff0c;现在还没看懂QAQ 先来一题简单的吧。哎&#xff0c;随缘更新吧 <?phphighlight_file(__FILE__);$comm1 $_GET[comm1]; $comm2 $_GET[comm2];if(preg_match("/\|\|\\|\…

新规正式发布 | 百度深度参编《生成式人工智能服务安全基本要求》

2024年2月29日&#xff0c;全国网络安全标准化技术委员会&#xff08; TC260 &#xff09;正式发布《生成式人工智能服务安全基本要求》&#xff08;以下简称《基本要求》&#xff09;。《基本要求》规定了生成式人工智能服务在安全方面的基本要求&#xff0c;包括语料安全、模…

弱电综合布线:连接现代生活的纽带

在当今信息化快速发展的时代&#xff0c;弱电网络布线作为信息传输的重要基础设施&#xff0c;其作用日益凸显。它不仅保障了数据的高效流通&#xff0c;还确保了通信的稳定性。从商业大厦到教育机构&#xff0c;从政府机关到医院急救中心&#xff0c;再到我们居住的社区&#…

【开课】云贝教育2024年3月9日-PostgreSQL中级工程师PGCE认证培训开课啦!

课程介绍 根据学员建议和市场需求,规划和设计了《PostgreSQL CE 认证课程》,本课程以内部原理、实践实战为主&#xff0c;理论与实践相结合。课程包含PG 简介、安装使用、服务管理、体系结构等基础知识。同时结合一线实战案例&#xff0c; 面向 PG 数据库的日常维护管理、服务和…

如何远程访问电脑文件?

远程访问电脑文件是当今数字化时代中十分常见且实用的技术。它允许我们从任何地方的计算机或移动设备访问和操作我们的电脑中的文件。无论是远程工作、远程学习、远程协作还是方便地获得自己计算机上的重要文件&#xff0c;远程访问电脑文件都为我们提供了巨大的便利。 在远程访…

从 iPhone 15/15 Pro 恢复丢失数据的 3 种方法

毫无疑问&#xff0c; iPhone 15 是迄今为止最令人印象深刻的 iPhone 。另一方面&#xff0c;我们知道&#xff0c;设备上保存的数据无论多么可靠&#xff0c;在设备使用过程中都可能因各种原因而丢失。 由于这些设备的性质&#xff0c;您在使用 iPhone 15、iPhone 15 Pro 或 …

大语言模型系列-GPT-2

文章目录 前言一、GPT-2做的改进二、GPT-2的表现总结 前言 《Language Models are Unsupervised Multitask Learners&#xff0c;2019》 前文提到&#xff0c;GPT-1利用不同的模型结构微调初步解决了多任务学习的问题&#xff0c;但是仍然是预训练微调的形式&#xff0c;GPT-…

[密码学]Base64编码

一、相关指令 1. 查看工具版本号 base64 --version2. 对字符串加密 echo 字符串 | base64 echo "Hello base64" | base643. 对字符串解密 echo 字符串 |base64 -d echo "SGVsbG8gTGV0aWFuLVJTQQo" | base64 -d4. 对文件加密 base64 文件名 base64 tex…

【Vue 3】

v-model 作用&#xff1a;给表单元素使用&#xff0c;双向数据绑定---->可以快速获取或设置表单元素内容 是value属性和input事件的合写 数据变化--->视图自动更新试图变化--->数据自动更新 语法&#xff1a;v-model"变量" 数据变&#xff0c;视图跟着变…

【你也能从零基础学会网站开发】Web建站之HTML+CSS入门篇 常用HTML标签(2)

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享 &#x1f40b; 希望大家多多支持, 我们一起学习和进步&#xff01; &#x1f3c5; 欢迎评论 ❤️点赞&#x1f4ac;评论 &#x1f4c2;收藏 &#x1f4c2;加关注 超级链接标…

遗传算法优化BP神经网络时间序列回归分析,ga-bp回归分析

目录 BP神经网络的原理 BP神经网络的定义 BP神经网络的基本结构 BP神经网络的神经元 BP神经网络的激活函数, BP神经网络的传递函数 遗传算法原理 遗传算法主要参数 遗传算法流程图 完整代码包含数据下载链接: 遗传算法优化BP神经网络时间序列回归分析,ga-bp回归分析(代码完…

实现的一个网页版的简易表白墙

实现的一个网页版的表白墙 实现效果 代码截图 相关代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><tit…

Java面试(4)之 Spring Bean生命周期过程

一, 整个加载的完整链路图 更详细的生命周期函数链路图(仅供参考) 二, Bean实例化的四种方式: 1, 无参构造器(默认且常用)6 2, 静态工厂方法方式(factory-method指定实例化的静态方法) 3, 实例工厂方法方式(factory-bean指定bean的name,factory-method指定实例化方法) 4, 实…

(黑马出品_04)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

&#xff08;黑马出品_04&#xff09;SpringCloudRabbitMQDockerRedis搜索分布式 微服务技术异步通信 今日目标1.初识MQ1.1.同步和异步通讯1.1.1.同步通讯1.1.2.异步通讯 1.2.技术对比 2.快速入门2.1.安装RabbitMQ2.1.1.单机部署(1).下载镜像方式…

Spark实战-基于Spark日志清洗与数据统计以及Zeppelin使用

Saprk-日志实战 一、用户行为日志 1.概念 用户每次访问网站时所有的行为日志(访问、浏览、搜索、点击)用户行为轨迹&#xff0c;流量日志2.原因 分析日志&#xff1a;网站页面访问量网站的粘性推荐3.生产渠道 (1)Nginx(2)Ajax4.日志内容 日志数据内容&#xff1a;1.访问的…