算法之排序

文章目录

  • 前言
  • 一、二分查找
    • 1、正常二分
    • 2、二分找第一个出现要查找的数的位置
    • 3、在旋转数组中找最小数字
    • 二分总结
  • 一、归并排序
    • 1、正常归并
    • 2、小和问题
    • 归并总结

前言

之前我们学习了各种排序算法,今天来让我们看看在线OJ上的题目吧,有哪些排序算法有什么样的延深吧。

一、二分查找

1、正常二分

查找有序数组中的数字,这是二分查找最常规的操作。

void Search() 
{int tmp[] = { -1,0,3,5,9,12 };int sz = sizeof(tmp) / sizeof(tmp[0]);int left = 0;int right = sz - 1;int target = 9;//要查找的值int pos = -1;//查找值的位置while (left <= right){int mid = left + ((right - left) >> 1);if (target < tmp[mid]){right = mid - 1;}else if (target > tmp[mid]){left = mid + 1;}else{pos = mid;break;}}printf("pos = %d\n", pos);
}
void test()
{Search();
}
int main()
{test();return 0;
}

在这里插入图片描述

思路:
在这里插入图片描述
点这里进入推荐练习哟

2、二分找第一个出现要查找的数的位置

在有重复元素且有序的数组中查找我们所要的第一个出现的数的位置,这是在上面得基础上在进行几次二分查找。

void Search() 
{int tmp[] = { 5,6,7,7,7,8,8,10 };int target = 8;int sz = sizeof(tmp) / sizeof(tmp[0]);int left = 0;int right = sz - 1;int pos = -1;while (left <= right){if (tmp[left] == target)//判断左边的值是否是我们第一个要找的值{pos = left;break;}int mid = left + ((right - left) >> 1);if (target <= tmp[mid])//注意要有等号{right = mid - 1;}else if (target > tmp[mid]){left = mid + 1;}}if (tmp[left] == target){pos = left;}printf("pos = %d", pos);
}

在这里插入图片描述
思路:
在这里插入图片描述
注意我们循环后要加一次判断,防止出现漏算的情况!!!
点击这里进入练习哟:这个找到我们第一次出现的数向后进行累加就可以了
点击这里进入练习哟:这个和上面的思路相似哦。

3、在旋转数组中找最小数字

int Search() 
{int tmp[] = { 3, 4, 5, 1, 2 };int left = 0;int right = sizeof(tmp) / sizeof(tmp[0]) - 1;while (left < right){int mid = left + ((right - left) >> 1);if (tmp[mid] < tmp[right]){right = mid;}else if (tmp[mid] > tmp[right]){left = mid + 1;}else{right -= 1;}}printf("%d\n", tmp[left]);
}
void test()
{Search();
}
int main()
{test();return 0;
}

在这里插入图片描述
思路:
在这里插入图片描述
我们通过数组中的区间关系来定位最小值的位置。
点击这里进入练习哟:这个使用三次二分就可以找到了

二分总结

我们使用二分不仅可以在有序数组中,只要符合我们一次可以去掉一般元素,符合我们二分思想就可以用我们的二分查找。我们查找波峰和波谷也可以通过二分来进行完成。

一、归并排序

1、正常归并

void MergeSort(int* nums, int left, int right,int *tmp)
{if (left >= right){return;}//把区间拆分为两段int middle = (left + right) >> 1;//拆分MergeSort(nums, left, middle, tmp);MergeSort(nums, middle+1, right, tmp);//归并int begin1 = left;int begin2 = middle + 1;int end1 = middle;int end2 = right;int i = 0;//和链表的链接差不多//直到有一个区间结束结束循环while ((begin1 <= end1) && (begin2 <= end2)){//那个值小那个值进入开辟的数组if (nums[begin1] <= nums[begin2]){tmp[i++] = nums[begin1++];}else{tmp[i++] = nums[begin2++];}}//找到未完全结束的数组,并且把数组中的元素尾加到开辟的数组中while (begin1 <= end1){tmp[i++] = nums[begin1++];}while (begin2 <= end2){tmp[i++] = nums[begin2++];}//把开辟的数组中的内容拷贝到源数组中//拷贝时要注意拷贝时的位置memcpy(nums + left, tmp, (right - left + 1) * sizeof(int));
}

在这里插入图片描述

2、小和问题

例如,数组 s = [1, 3, 5, 2, 4, 6] ,在 s[0] 的左边小于或等于 s[0] 的数的和为 0 ; 在 s[1] 的左边小于或等于 s[1] 的数的和为 1 ;在 s[2] 的左边小于或等于 s[2] 的数的和为 1+3=4 ;在 s[3] 的左边小于或等于 s[3] 的数的和为 1 。

int minSum(int* tmp, int left, int right) {if (left == right){return 0;}int mid = (left + right) / 2;//进行区间划分return minSum(tmp, left, mid)+ minSum(tmp, mid + 1, right)+ merge(tmp, left, mid, right);
}
int merge(int* tmp, int left, int mid, int right)
{int n = right - left + 1;int* help = (int*)malloc(sizeof(int)*n);//开辟辅助空间int index = 0;int p1 = left;int p2 = mid + 1;long long sum = 0;//进行归并并计算小和while (p1 <= mid && p2 <= right){if (tmp[p1] <= tmp[p2]){sum += (right - p2 + 1) * tmp[p1];//计算小和help[index++] = tmp[p1++];}else {help[index++] = tmp[p2++];}}while (p1 <= mid){help[index++] = tmp[p1++];}while (p2 <= right){help[index++] = tmp[p2++];}for (int i = 0; i < n; i++) {tmp[left + i] = help[i];}return sum;
}
void test()
{//Search();int tmp[] = { 1, 3, 5, 2, 4, 6 };int sz = sizeof(tmp) / sizeof(tmp[0]);int sum = minSum(tmp, 0, sz - 1);printf("%d\n", sum);
}
int main()
{test();return 0;
}

在这里插入图片描述
思路:
在这里插入图片描述
我们在归并的同时计算右区间有几个元素大于次元素,这样归并就可计算出小和了
题目练习

归并总结

我们还可以用归并算出逆序对的个数,思路和小和问题一样,在归并过程中顺便解决问题。

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

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

相关文章

CPP-Templates-2nd--第十四章 实例化

目录 14.1 On-Demand实例化 14.2 延迟实例化 14.2.1 部分实例化和完整实例化 14.2.2 实例化组件 14.3 C实例化模型 14.3.1 两阶段查找 14.3.2 POI 14.3.3 包含式模型 14.4 几种实现方案 14.4.1 贪婪实例化 14.4.2 查询实例化 14.4.3 迭代实例化 参考&#xff1a;…

jvm 内存模型介绍

一、类加载子系统 1、类加载的过程&#xff1a;装载、链接、初始化&#xff0c;其中&#xff0c;链接又分为验证、准备和解析 装载&#xff1a;加载class文件 验证&#xff1a;确保字节流中包含信息符合当前虚拟机要求 准备&#xff1a;分配内存&#xff0c;设置初始值 解析&a…

数据分析工具有哪些,哪个好学?

Tableau、帆软BI、思迈特BI、SpeedBI数据分析云……这些都是比较常见的BI数据分析工具。从学习成本、操作难度以及数据可视化分析效果来看&#xff0c;SpeedBI数据分析云都表现地可圈可点。 1、不需下载安装、学习成本低 SpeedBI数据分析云是一款SaaS BI数据分析工具&#xf…

【AIGC专题】Stable Diffusion 从入门到企业级实战0601

一、前言 本章是《Stable Diffusion 从入门到企业级实战》系列的第六部分Prompt专题篇《Stable Diffusion Prompt 专题》第01节 《Stable Diffusion Prompt 通用画风操作实战》。本部分内容&#xff0c;位于整个Stable Diffusion生态体系的位置如下图黄色部分所示&#xff1a;…

【简单教程】利用Net2FTP构建免费个人网盘,实现便捷的文件管理

文章目录 1.前言2. Net2FTP网站搭建2.1. Net2FTP下载和安装2.2. Net2FTP网页测试 3. cpolar内网穿透3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 文件传输可以说是互联网最主要的应用之一&#xff0c;特别是智能设备的大面积使用&#xff0c;无论是个人…

Python中异常处理4-4

在Python中的异常处理4-1_棉猴的博客-CSDN博客中提到&#xff0c;在try块中的代码运行时如果出现异常&#xff0c;会自动抛出这个异常。可以通过raise语句手动抛出异常。 1 raise语句手动抛出异常 raise后面跟要抛出的异常类或者异常类的实例&#xff0c;表示手动抛出该异常&…

翻牌闯关游戏

翻牌闯关游戏 3关&#xff1a;关卡由少至多12格、20格、30格图案&#xff1a;12个玩法&#xff1a;点击两张卡牌&#xff0c;图案一到即可消除掉 记忆时长(毫秒)&#xff1a;memoryDurationTime:5000 可配置&#xff0c;默认5000 提示游戏玩法&#xff1a;showTipsFlag:1 可…

【分布式】分布式ID

目录 前言一、雪花算法snowflake1. 组成2. 优缺点3. 时钟回拨怎么解决a. 时钟回拨b. 解决方案 4. 项目中如何使用 二、基于Redis三、基于Zookeeper四、号段模式五、指定步长的自增ID六、UUID参考 六、扩展总结 前言 分布式场景下&#xff0c;一张表可能分散到多个数据结点上。因…

uniapp——实现在线选座功能——技能提升

首先声明一点&#xff1a;下面的内容是从一个uniapp的程序中摘录的&#xff0c;并非本人所写&#xff0c;先做记录&#xff0c;以免后续遇到相似需求抓耳挠腮。 这里写目录标题 效果图代码——html部分cu-custom组件anil-seat组件 代码——jscss部分 效果图 代码——html部分 …

gin-基础笔记

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、get和post方法二、重定向总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;随着人工智能的不断发展&#xff0…

uniapp掉完接口后刷新当前页面方法

uniapp掉完接口后刷新当前页面方法 掉完接口&#xff0c;里面加下面这个方法uni.redirectTo({}) setTimeout(() > {uni.redirectTo({// 当前页面路由url: /pages/property/mutualrotation/mutualrotation);}, 500)实例 mutualRotationSubmit() {let self this;uni.showMod…

Python Opencv实践 - 视频文件操作

参考资料&#xff1a; 视频处理VideoCapture类---OpenCV-Python开发指南&#xff08;38&#xff09;_python opencv videocapture_李元静的博客-CSDN博客 OpenCV VideoCapture.get()参数详解 - 简书FOURCC四字符码对照表_4fvcc_Kellybook的博客-CSDN博客 import cv2 as cv im…

网络基础--1.网络纵横

网络的发展历程 计算机由原来的只能单一处理信息&#xff08;单用户批处理&#xff09;逐步发展为多用户批处理&#xff0c;可以实现一台计算机连接多个终端同时使用一台计算机&#xff08;分时系统&#xff09;&#xff0c;但是多个终端之间不能相互通信&#xff0c;再发展成为…

API接口文档管理系统平台搭建(更新,附系统源码及教程)

简介 这是一款简洁大方的API接口文档管理系统&#xff0c;附系统源码及教程方法。可以轻松管理和使用API接口。 安装步骤 打开config/database.php配置数据库信息导入数据库data.sql设置运行目录为/public伪静态设置think PHP后台地址/admin/login.html 账号&#xff1a;adm…

git 远程名称 远程分支 介绍

原文&#xff1a; 开发者社区> 越前君> 细读 Git | 让你弄懂 origin、HEAD、FETCH_HEAD 相关内容 读书笔记&#xff1a;担心大佬文章搬家&#xff0c;故整理此学习笔记 远程名称&#xff08;Remote Name&#xff09; Origin 1、 origin 只是远程仓库的一个名称&#xff…

【Kafka】Kafka再平衡机制及相关参数

背景 Kafka作为一款基于发布订阅模式的消息队列&#xff0c;生产者将消息发送到Kafka集群&#xff08;Brokers&#xff09;中&#xff0c;消费者&#xff08;Consumer Group &#xff09;拉取消息进行消费&#xff0c;实现了异步机制。Kafka中&#xff0c;消费者通常以消费者组…

解决方案| anyRTC远程检修应用场景

背景 在这个科技飞速发展的时代&#xff0c;各行各业都要求高效运转。然而&#xff0c;当出现问题时&#xff0c;我们却常常因为无法及时解决而感到困扰&#xff0c;传统解决问题的方式是邀请技术人员现场解决问题&#xff0c;如果技术人员解决不了&#xff0c;还要邀请专家从…

编程参考 - std::exchange和std::swap的区别

这两个功能是C standard library中的Standard template library中的一部分。容易混淆&#xff0c;我们来看下它们的区别。 exchange&#xff1a; 这个函数是一个返回原先值的set函数。 std::exchange is a setter returning the old value. int z std::exchange(x, y); Af…

C语言指针详解(3)———指针题目,你确定你学会指针了?进来看看吧!(几十个指针小题+超详解)

你确定你学会指针了&#xff1f; 你确定你明白数组名了&#xff1f; 如果你觉得你学的还不错&#xff0c;就进来看看吧&#xff0c;相信你看完之后一定能收获更多。 数组名的理解一定要弄清楚 数组名是数组首元素的地址 但是有2个例外&#xff1a; sizeof(数组名)&#xff0c;这…

【MySQL多表查询以及事务、索引】

1. 多表查询 1.1 概述 1.1.1 数据准备 #建议&#xff1a;创建新的数据库 create database db04; use db04;-- 部门表 create table tb_dept (id int unsigned primary key auto_increment comment 主键ID,name varchar(10) not null unique comment 部门名称…