学习部分排序,插入排序,冒泡排序以及希尔排序

1.插入排序

<1>.首先我们举个例子

我们要把6进行前面的插入,那我们要进行比较,首先确定一个end的指针,然后他指向的数字就是我们需要比较的,如果end指向的数比我们end+1 的大的话,那我们就往前挪一个,让end指向的数位置换到刚才end+1 的位置,也就是6的位置。然后end--,如果end指向的数比6小大,我们循环停止。如果按照我们的例子来看,那么就应该是这样的

那么我们前面的的数怎么办,他们还没有成为有序的数组,那如果我们前面一开始就是有序的,那么是不是从后面开始比较,然后停止的时候,是不是就全都是有序的。那我们如果从一开始,一点一点让他们成为有序的,一直到end指向数组最后一个数的前一个数,然后进行刚才的比较,那么全都是有序的。也就是说应该是这样的

第一次单个3就算是有序的数组,然后和五进行比较

第二次,3 5 和8进行比较然后3 5 8就是有序的

第三次,3 5 8和4 开始比较,那么按照顺序就是 3 4 5 8.。。。。依次类推,然后 我们就得到了排序

那么end就是在有序数组的最后一个,然后把end+1的位置存进tmp,如果比较成立,end的数字向后移动,覆盖end+1位置的数,当如果是逆序排列,end就会到达-1的位置,那么遍历也就结束了,这也成为了我们while的判断条件

void InsertSort(int* arr, int n)
{for(int i=0;i<n-1;i++){ int end=i;int tmp = arr[end + 1];while (end >= 0){if (arr[end] > tmp){arr[end + 1] = arr[end];end--;}else{break;}}arr[end + 1] = tmp;}
}

代码就是这样写的

提醒大家的是while循环结束后,把end+1的位置放tmp,就是我们每次较完之后end,如果要进行挪动,那么end最后的位置就是空的,那么我们就要把刚才存的end+1的位置的数字tmp存进去。

2冒泡排序

冒泡排序我们在c语言里面实现过我们就不多说了

第一层循环时为了把第一个数依次向后比较,第二层控制第一层进行比较的次数,第一次,最后一个数就排好了,那么第一层循环就少了一层。

void BubbleSort(int* arr, int n)
{for (int i = 0; i < n-1; i++){int exchang = 0;for (int j = 1; j < n - i; j++){if (arr[j - 1] > arr[j]){Swap(&arr[j - 1], &arr[j]);exchang = 1;}}if (exchang == 0){break;}}
}
void Swap(int* x, int* y)
{int t = *x;*x = *y;*y = t;
}

3.希尔排序

希尔排序时我们以插入排序为基础,比之前有点难度。、

按照之前的希尔排序在我们设立的每次依次分的有序数组,他进行规范行的分组,画图

假设我们每次规定的一个数组是间隙三个的,然后我们第一次调整蓝色的有序数组,那么第一次就是3为有序数组,然后和4 比较,接着3 4和7 比较

接着红色这组,再然后绿色的。这样遍历就可以。我们红色算一组,可以按照刚才的插入的排序写一个循环,我们怎么知道我们要循环几次,其实间隙是几,我们就循环几次。先实现一下。

int gap = 3;这个写法是进行固定一个小组进行轮换,然后在进行下一个小组for (int j = 0; j < gap; j++)//间隙有几个就进行几次循环{for (int i = 0; i < n - gap; i+=gap)i<gap这样的话最后的end不会越界{int end = i;int tmp = arr[end + gap];while (end >= 0){if (arr[end] > tmp){arr[end + gap] = arr[end];}else{break;}}arr[end+gap]=tmp;}}

n是数组个数,我们为什么要让i小于n-gap(间隙),刚才插入排序是不是小于n-1,其实道理差不多,如果我们end按照间隙加,那最后一次如果超过n不就越界访问了,所以让end<n-gap,使得找end+gap的情况不越界。

那么我们的间隙该怎么定呢。间隙越大,换的越快,越不接近有序数组。间隙越小,换的越慢,越接近有序数组。那我们如果让间隙是变化的,那这样不久越来越好了。应该从大往小变,为什么,第一次间隙为1,直接写成插入排序了。哈哈哈哈。但是这这只是预排序,那么之后该怎么排序才能完全成为有序的呢。那么我们最后一次进行插入排序是不是就可以了。那么正好是不是和刚才的间隙对应上了,如果我们让间隙从大变小,直到变为1,那就完成了希尔排序。第一次的间隙我们取数组的一半,为什么?你想想如果比一半大,那还能找到end+gap的数嘛,直接越界了。哈哈哈哈哈哈哈哈哈哈哈哈。

void ShellSort(int* arr, int n)
{int gap = n;while (gap){gap /= 2;for (int i = 0; i < n - gap; i++)//从每个的头开始依次遍历,进行循环调整{int end = i;int tmp = arr[end + gap];while (end <n){if (arr[end] > tmp){arr[end + gap] = arr[end];end -= gap;}else{break;}}arr[end + gap] = tmp;}}
}

有没有发现和刚才不一样,for循环从两个变成一个了,我们进行了改进,反正我们从蓝色完了就是红色,再然后就是绿色。那我们直接从第一个开始依次加间隙,直到end加间隙越界,不就行了。也就是蓝色组第一个,接着红色组第一个,绿色组第一个,然后蓝色第二个。。。。

感谢观看,欢迎指出错误。

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

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

相关文章

有效Dk值提取方法的仿真分析

目录 1. TDR技术提取Dk值的方法 2. 传输线双端口Delta-L技术提取Dk值的方法 3. 传输线单端口Delta-L技术提取Dk值的方法 4. 总结 参考文献 1. TDR技术提取Dk值的方法 测试有效Dk值的一些传统而有效的方法[1][2]&#xff0c;是采用TDR阻抗测试仪测试专门设计的传输线的传播延…

我的AI数字人分身上线了!

说起AI数字人&#xff0c;大家一定不会陌生。随着全民AI时代的到来&#xff0c;许多机关单位、企业和个人&#xff0c;都纷纷制作了自己的数字人形象。 前些天&#xff0c;小灰的老东家刘强东也开始用数字人直播带货&#xff0c;瞬间引爆了全网。 这一切背后的本质是什么呢&…

抽真空规范操作

抽真空规范操作 抽真空操作中&#xff0c;一个被忽视的现象是&#xff1a;许多维修人员热衷于解决空调故障&#xff0c;却对施工过程中的规范操作敷衍了事。殊不知&#xff0c;正是这些看似微不足道的细节疏忽&#xff0c;往往诱发空调各类疑难故障&#xff0c;令售后维修陷入…

【创建型模式】原型模式

一、原型模式概述 原型&#xff08;Prototype&#xff09;模式的定义&#xff1a;用一个已经创建的实例作为原型&#xff0c;通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里&#xff0c;原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效&#xf…

吴恩达深度学习笔记:深度学习的 实践层面 (Practical aspects of Deep Learning)1.4-1.5

目录 第一门课&#xff1a;第二门课 改善深层神经网络&#xff1a;超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)第一周&#xff1a;深度学习的 实践层面 (Practical aspects of Deep Learning)…

Vue接收接口返回的mp3格式数据并支持在页面播放音频

一、背景简介 在实际工作中需要开发一个转音频工具&#xff0c;并且能够在平台页面点击播放按钮播放音频 二、相关知识介绍 2.1 JS内置对象Blob Blob对象通常用于处理大量的二进制数据&#xff0c;可以读取/写入/操作文件、音视频等二进制数据流。Blob表示了一段不可变的二…

【PCL】教程alignment_prerejective.cpp 刚性物体的鲁棒位姿估计

The viewer window provides interactive commands; for help, press h or H from within the window. > Loading V:\learn\PCL\pcl\examples\test\chef.pcd [PCLVisualizer::setUseVbos] Has no effect when OpenGL version is 鈮?2 [done, 327.147 ms : 5092 points] Ava…

AI大模型量化格式介绍(GPTQ,GGML,GGUF,FP16/INT8/INT4)

在 HuggingFace 上下载模型时&#xff0c;经常会看到模型的名称会带有fp16、GPTQ&#xff0c;GGML等字样&#xff0c;对不熟悉模型量化的同学来说&#xff0c;这些字样可能会让人摸不着头脑&#xff0c;我开始也是一头雾水&#xff0c;后来通过查阅资料&#xff0c;总算有了一些…

DFS之剪枝(上交考研题目--正方形数组的数目)

题目 给定一个非负整数数组 A A A&#xff0c;如果该数组每对相邻元素之和是一个完全平方数&#xff0c;则称这一数组为正方形数组。 返回 A A A 的正方形排列的数目。 两个排列 A 1 A1 A1 和 A 2 A2 A2 不同的充要条件是存在某个索引 i i i&#xff0c;使得 A 1 [ i …

测试一下 Meta Llama3-70b-Instruct-q8

测试一下 Meta Llama3-70b-Instruct-q8 0. 引言1. 测试 Meta Llama3-70b-Instruct-q8 0. 引言 今天&#xff0c;Meta 正式介绍Meta Llama 3&#xff0c;Meta 开源大型语言模型的下一代产品。 这次发布包括具有80亿&#xff08;8B&#xff09;和700亿&#xff08;70B&#xff0…

指纹浏览器如何高效帮助TikTok账号矩阵搭建?

TikTok的账号矩阵&#xff0c;可能听起来还比较陌生&#xff0c;但随着TikTok业务已经成为吃手可热的跨境业务&#xff0c;TikTok多账号矩阵已成为流行策略。但它有什么优点呢&#xff1f;操作多个帐户会导致被禁止吗&#xff1f;如何有效地建立账户矩阵开展业务&#xff1f;这…

CANfestival 主机进入预操作态(preOperational)自动发送复位节点指令。

核心是iam_a_slave ,这个是字典生产的时候自动生成的。

【Flutter】多语言方案一:flutter_localizations 与 GetX 配合版

系列文章目录 多语言方案&#xff1a;flutter_localizations 与 GetX 配合版&#xff0c;好处&#xff1a;命令行生成多语言字符串的引用常量类&#xff0c;缺点&#xff1a;切换语言以后&#xff0c;主界面需要手动触发setState&#xff0c;重绘将最新的Locale数据设置给GetM…

使用LangChain和Llama-Index实现多重检索RAG

大家好&#xff0c;在信息检索的世界里&#xff0c;查询扩展技术正引领着一场效率革命。本文将介绍这一技术的核心多查询检索&#xff0c;以及其是如何在LangChain和Llama-Index中得到应用的。 1.查询扩展 查询扩展是一种信息检索技术&#xff0c;通过在原始查询的基础上增加…

基于Springboot的简历系统

基于SpringbootVue的简历系统的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页 简历模板 招聘会 求职论坛 系统公告 后台登录 后台首页 用户管理 简历模板 模板…

uniapp中scroll-view初始化的时候 无法横向滚动到某个为止

项目需求 实现日历&#xff08;13天&#xff09;默认高亮第六天 并定位到第六 左边右边各六天&#xff08;可以滑动&#xff09; 直接上代码 <template><scroll-view class"scroll-X":show-scrollbar"true" :scroll-x"scrollable":…

OpenHarmony网络组件-Mars

项目简介 Mars 是一个跨平台的网络组件&#xff0c;包括主要用于网络请求中的长连接&#xff0c;短连接&#xff0c;是基于 socket 层的解决方案&#xff0c;在网络调优方面有更好的可控性&#xff0c;暂不支持HTTP协议。 Mars 极大的方便了开发者的开发效率。 效果演示 编译…

产废端实时音视频监控系统在运输车辆驾驶室中的应用

实时音视频监控系统可通过在运输车辆驾驶室安装音视频摄录设备&#xff0c;实现将运输车辆内部及周围环境音视频数据通过移动网络实时回传指挥中心的功能。 前端摄录设备主要负责采集车内外的视音频信息&#xff0c;为了保障车辆及运输人员 的安全&#xff0c;应合理选择摄录设…

【多线程】定时器 | 线程池 | 实现MyTimer | 实现MyThreadPoll | 工厂模式 | 构造方法 | 参数种类

文章目录 定时器&线程池一、定时器1.标准库中的定时器2.实现定时器 二、线程池1.线程池的概念线程池&#xff1a; 2.标准库当中的线程池工厂模式 Executors 创建线程池1.自适应线程池2.固定数量线程池3.只有单个线程的线程池4.设定延迟时间后执行命令的线程池 ThreadPoolEx…

BNB链融合

BNB Chain融合 BNB Chain目前有BNB智能链&#xff08;BSC&#xff09;&#xff0c;BNB信标链 BNB信标链&#xff1a;用作质押和投票的治理层&#xff0c;采用BEP-2代币标准BNB智能链(BSC)&#xff1a;用作EVM兼容层&#xff0c;提供DApp、DeFi服务、共识层、多链支持和其他Web3…