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

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.hqwc.cn/news/631054.html

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

相关文章

Docker向harbor上传大镜像的413报错

文章目录 一、背景二、问题三、处理1.调整harbor相关大小2.正向代理的nginx参数 一、背景 最近遇到了个需求&#xff0c;某厂商的系统模块以容器模式部署在我们的内网环境中&#xff0c;厂商为我们提供了一个公网仓库&#xff0c;需要我们自己下载相关镜像。因此&#xff0c;获…

Spring学习(三)——AOP

AOP是在不改原有代码的前提下对其进行增强 AOP(Aspect Oriented Programming)面向切面编程&#xff0c;在不惊动原始设计的基础上为其进行功能增强&#xff0c;前面咱们有技术就可以实现这样的功能即代理模式。Java设计模式——代理模式-CSDN博客 基础概念 连接点&#xff08…

graphviz使用

安装 brew install graphviz测试 https://github.com/martisak/dotnets?tabreadme-ov-file

从Linux角度具体理解程序翻译过程-----预处理、编译、汇编、链接

前言&#xff1a; 在C语言中&#xff0c;我们知道程序从我们所写的代码到可执行执行的过程中经历了以下过程 1.预处理 2.编译 3.汇编 4.链接 可以通过下图来理解 翻译过程 1.预处理 该过程主要进行以下操作&#xff1a; (1)头文件的包含 (2)define定义符号的替换&#xff…

C语言——九九乘法表

直接上代码实现九九乘法表&#xff0c;完整代码如下&#xff1a; #include <stdio.h>int main(){int i,j;for(i1;i<10;i){for(j1;j<i;j){printf("%d*%d%d\t",j,i,i*j);/*printf("%d*%d%-2d",j,i,i*j);*/}printf("\n");}return 0; }…

常用的7个免费ChatGPT网站

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

SpringCloud系列(5)--SpringCloud微服务工程公共部分提取

前言&#xff1a;在上一章节中我们创建了两个个SpringCloud工程&#xff0c;但在两个工程中分别存在着一些重复的部分&#xff0c;例如重复的实体类&#xff08;如图所示&#xff09;&#xff0c;这样会造成系统的冗余&#xff0c;所以我们需要把公共的类提取到一个工程里&…

41、二叉树-二叉树的层序遍历

思路&#xff1a; 层序遍历就是从左到右依次遍历。这个时候就可以使用队列的方式。例如先把头节点入队&#xff0c;然后遍历开始&#xff0c;首先计算队列长度&#xff0c;第一层&#xff0c;长度为了&#xff0c;遍历一次&#xff0c;依次出队&#xff0c;头结点出队&#xff…

Linux的学习之路:13、进程替代

摘要 本章主要是说一下进程替代用到的函数exec以及自己实现的简易shell 目录 摘要 一、进程程序替换 1、替换原理 2 、替换函数 3、函数解释与命令理解 4、代码演示 1、execl 2、execv 3、execlp 4、execvp 二、简易的myshell 三、代码 myshell exec 一、进程…

Ubuntu 22最新dockers部署redis哨兵模式,并整合spring boot的详细记录(含spring boot项目包)

dockers部署redis哨兵模式&#xff0c;并整合spring boot 环境说明相关学习博客一、在docker中安装redis1、下载dockers镜像包和redis配置文件&#xff08;主从一样&#xff09;2、编辑配置文件&#xff08;主从一样&#xff09;3、启动redis&#xff08;主从一样&#xff09;4…

【OpenGL实践08】现代渲染管线在GLUT和Pygame和Qt.QOpenGLWidget上各自的实现代码

Qt.QOpenGLWidget进行现代渲染管线实验效果 一、说明 据说QOpenGLWidget是用来取代QGLWidget的继承者&#xff0c;我们试图将GLUT上的旧代码改成QOpenGLWidget&#xff0c;本以为差别不大&#xff0c;轻易搞定&#xff0c;经实践发现要付出极大努力才能完成。经多次实验发现G…

工作流JBPM操作API组任务

文章目录 8.10 组任务8.10.1 组任务的分配8.10.1.1 写死的方式指定8.10.1.2 实现AssignmentHandler接口指定 8.10.2 查询自己的组任务8.10.3 办理自己的组任务 8.10 组任务8.10.1 组任务的分配8.10.1.1 写死的方式指定8.10.1.2 实现AssignmentHandler接口指定 8.10.2 查询自己的…