(搞定)排序数据结构(1)插入排序 选择排序+冒泡排序

目录

本章内容如下  

 一:插入排序              

                1.1插入排序    

              1.2希尔排序    

二:选择排序     

              2.1选择排序

 三:交换排序      

             3.1冒泡排序


一:插入排序                    
 

        1.1直接插入排序
    

        说到排序,其实在我们生活中非常常见,比如当我们需要在网上买东西的时候,  我们可以按照价格排序,也可以按照销量进行排序,所以对于我们来说学习排序这个数据结构是非常重要的,在本文中,我会尽可能按照我的理解将目录中的排序给将清楚。

        

                     下面就是我在一个网购网站中进行截取的图片,我们可以看到排序无处不见。


    
        
        现在让我们进入排序的讲解!!
            
            首先我们讲解的是插入排序
                首先我们来认识一下插入排序这个算法,插入排序顾名思义就是插入到前(n-1)个有序
                数中
,这就像我们生活中经常玩扑克牌的时候的思想,我们玩扑克牌的时候有一种摸牌
                思路就是将第一张牌有序,然后让后面的牌进行插入使得我们的牌一直有序。
                 
                 下面我通过一群数字来进行讲解
                   比如说我们的数组中的值为   9   4    7   2   5   3   1  6   8  
                     这9个数字那么我们如何使得这个数组有序呢?
                     我们通过画图来进行讲解!!

        很明显我们对于插入排序的思想

 思路 :假设我们要插入第n个数,我们需要保证前n-1个数有序,然后再进行插入,没插入一个数我们就要将该数前面的数与要插入的数经行比较,如果大于这个要插入的数那我们就将他玩后面进行移动就可以了。
    
      
        

        

void InsertSort(int* a, int n)
{//使前n-1个数先有序,然后插入第n个数for (int  i = 0; i < n-1; i++){int end = i;int tmp = a[end + 1];//一趟插入排序的思路while (end >= 0){if (tmp < a[end]){a[end + 1] = a[end];end--;}else{break;}}a[end + 1] = tmp;}
}

        
    
            现在让我们来算一下插入排序的时间复杂度,与空间复杂度吧。
                时间复杂度最好:O(N),     最坏:O(n^2)
                首先我们不难发现它的空间复杂度为O(1)
                最坏时间复杂度:O(n^2),当一个数组为逆序的时候,就是插入排序的最坏的
                情况,在这种情况下我们一共有N个数字,插入一个数我们就需要将前面的
                数字全部像后面进行移动一次,然后在插入所以总共来说就是N*N.
                最好的情况是什么呢,最好的情况当然是当数组顺序有序的时候,每一个数
                只要插入就行了,而不需要移动元素,插入的时间复杂度为O(1),所以总共
                的时间复杂度为O(1*N)=O(N).



1.2希尔排序
    


            其实希尔排序的本质也是插入排序,希尔排序只是在插入排序上进行的一个优化的
            排序我们在上面的插入排序中不难发现,当数组有序的时候,我们的插入排序的
            时间复杂度是非常好的为O(N),而我们的希尔大佬就是看到了这个特点,
            所以就在插入排序中进行了优化,才有了我们著名的一个排序算法叫做希尔排序。
      

     希尔排序的思想是什么呢?
                其实希尔排序的思想其实也非常简单 先预排序,在直接插入排序
                1:先对数组进行多组预排序,使得数组中的一些子数组接近有序。
                2:在对数组进行插入排序。
            我们用图来讲解一组预排序

         我们不难看出在进行一组预排序完成后我们的数组相对于原来的数组就接近有序了
         且gap越小的时候我们的数组越接近有序,当gap==1的时候我们的,我们的预排序
         就是直接插入排序
                   代码如下:
                               

//版本一
void ShellSort(int* a, int n)
{int k = 0;int gap = n;while(gap!=1){gap /= 2;//最后一次gap一定等于1//多组预排序,也就是我们图中红黑绿三组进行预排序for (int j = 0; j < gap; j++){//一组预排序操作for (int i = 0; i < n - gap; i += gap){int end = i;int tmp = a[end + gap];while (end >= 0){if (tmp < a[end]){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}}}}``````c
```版本二:有点像优化的版本
void ShellSort(int* a, int n)
{int k = 0;int gap = n;while(gap!=1){gap=gap/3 +1;//最后一次gap一定等于1    //间距为gap的值从前往后直接进行交换for (int i = 0; i < n - gap; i ++){int end = i;int tmp = a[end + gap];while (end >= 0){if (tmp < a[end]){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}}}



 


         希尔排序的时间复杂度是多少呢?
         其实书上也没有给出明确的证明,有很多种不同的看法,但是差不多是O(N^1.3),这个我也不会证明,需要涉及到高阶的数学。
       大家如果有兴趣的话可以去证明一下。

        到这里我们的插入排序就讲解完毕了,希尔排序需要大家自行的去画图,多思考
        
--------    


二:选择排序
    
        

其实我们的选择排序有两种,一种是直接选择排序,也是我们讲解的排序,还有一种就是堆排序,而堆排序我们之前已经讲解过了,如果你还没看的话建议先直接去补一下。

        堆排序链接:https://blog.csdn.net/2201_75964502/article/details/133017420?spm=1001.2014.3001.5501    

 在这里我们主要讲解选择排序的优化版本,就是我们遍历一边数组,选出两个值
        一个最大值我们往后面插入,还有一个最小值玩前面插入。
        直到我们将数组排序好就可以了。
        思想:遍历一遍选最大值与最小值,然后排序就行了。
        图:这里只写了1个步骤

        代码如下:
            

void SelectSort(int* a, int n)
{int begin = 0;int end = n-1;while (begin < end){int maxi = begin;int mini = begin;for(int i =begin;i<=end;i++){//选最小的下标if (a[mini] > a[i]){mini = i;}//选最大的下标if (a[maxi] < a[i]){maxi = i;}}Swap(&a[begin], &a[mini]);//防止最大值就在begin处if (begin == maxi){maxi = mini;}Swap(&a[maxi], &a[end]);begin++;end--;}
}


    选择排序的时间复杂度:O(^2)
          因为它的时间复杂度算法是一个等差数列:(n)+(n-2)_......+2+0
          每次都需要遍历数组选两个值,固定的        

          所以选择排序是很稳定的。


-------
三:交换排序


        
        其实我们的交换排序也有两种,一种是快速排序,另外一种就是我们本章所讲解的
        冒泡排序,而我们的快速排序由于有几种方法,且有点难,所以我会独自整理成一篇
        文章来进行讲解我们的快速排序。
        
            其实冒泡排序可能是我们见过最多的一种排序,它的思想并不难理解
            冒泡排序的思想是什么呢?
            思想:
                遍历一遍数组,两两相邻的元素进行比较,将数组中最大元素的值给冒到最
                后去,一直遍历,直到数组变成有序的数组

                
                代码如下:
                

        

void BubbleSort(int* a, int n)
{int i = 0;//一共冒泡几趟for (int  i = 0; i < n-1; i++){int exchange = 1;//一趟内部for (int j = 0; j < n-i-1; j++){if (a[j] > a[j + 1]){exchange = 0;Swap(&a[j], &a[j + 1]);}}if (exchange == 1){//说明原数组有序,就不需要进行排序了break;}}}


    冒泡排序的时间复杂度:O(N^2)
    它非常稳定。,因为时间复杂度是固定的

        感谢大家的观看,如果你觉得对你有帮助的话,可以给博主一个赞哦!!
            

    

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

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

相关文章

VisionTransformer(ViT)详细架构图

这是原版的架构图&#xff0c;少了很多东西。 这是我根据源码总结出来的详细版 有几点需要说明的&#xff0c;看架构图能看懂就不用看注释了。 &#xff08;1&#xff09;输入图片必须是 224x224x3 的&#xff0c;如果不是就把它缩放到这个尺寸。 &#xff08;2&#xff09;T…

PHP生成二维码带图标代码实例

PHP生成二维码带图标代码实例&#xff08;PHP QR Code二维码生成类库&#xff09; public static function png($text, $outfilefalse, $levelQR_ECLEVEL_L, $size3, $margin4, $saveandprintfalse) { $enc QRencode::factory($level, $size, $margin); return $enc->…

Bee2.1.8支持Spring Boot 3.0.11,active命令行选择多环境,多表查改增删(bee-spring-boot发布,更新maven)

天下大势&#xff0c;分久必合&#xff01; Hibernate/MyBatis plus Sharding JDBC Jpa Spring data GraphQL App ORM (Android, 鸿蒙) Bee Spring Cloud 微服务使用数据库更方便&#xff1a;Bee Spring Boot; 轻松支持多数据源&#xff0c;Sharding, Mongodb. 要整合一堆的…

简历项目优化关键方法论-START

START方法论是非常著名的面试法则&#xff0c;经常被面试官使用的工具 Situation:情况、事情、项目需求是在什么情况下发生Task:任务&#xff0c;你负责的做的是什么Action:动作&#xff0c;针对这样的情况分析&#xff0c;你采用了什么行动方式Result:结果&#xff0c;在这样…

【接口技术】总线课堂习题

1&#xff1a;CPU在执行OUT DX, AL指令时&#xff0c;&#xff08;&#xff09;寄存器的内容送到地址总线上 A&#xff0c;DL B&#xff0c;DX C&#xff0c;AX D&#xff0c;DL 解答&#xff1a;B out指令是把AL的数据输出到DX的端口&#xff0c;因此AL寄存器的内容送到…

uniapp app 导出excel 表格

直接复制运行 <template><view><button click"tableToExcel">导出一个表来看</button><view>{{ successTip }}</view></view> </template><script>export default {data() {return {successTip: }},metho…

Unity把UGUI再World模式下显示到相机最前方

Unity把UGUI再World模式下显示到相机最前方 通过脚本修改Shader 再VR里有时候要把3D的UI显示到相机最前方&#xff0c;加个UI相机会坏事&#xff0c;可以通过修改unity_GUIZTestMode来解决。 测试用例 测试用例如下&#xff1a; 场景包含一个红色的盒子&#xff0c;一个UI…

Linux作业2

Linux中的 stdin 、stderr、stdout分别是什么意思 在 Linux 中&#xff0c;stdin、stdout 和 stderr 是标准的输入、标准的输出和标准的错误的缩写&#xff0c;它们是与终端相关联的默认文件描述符&#xff0c;用于处理输入和输出。以下是它们的详细含义&#xff1a; stdin&am…

Java类与对象

文章目录 引出概念快速入门对象内存布局属性概念创建对象访问属性对象分配机制成员方法&#x1f996;注意事项和细节 引出 ●看一个养猫猫问题 张老太养了两只猫猫: 一只名字叫小白, 今年3岁, 白色. 还有一只叫小花, 今年100岁, 花色. 请编写一个程序, 当用户输入小猫的名字时…

zookeeper mac安装

目录 1.下载zookeeper安装包 2.解压安装包 3.修改配置文件 4.启动服务端 5.启动客户端 这边工作中用到了zookeeper组件&#xff0c;但自己独立安装弄的不太多&#xff0c;这边本机mac装一个做测试使用 以下是安装记录&#xff0c;可以作为参考 从以下链接zookeeper版本列…

当面试被问到jvm(Java虚拟机)时,如何将面试官引入自己的节奏?

本文目录 前言快问快答抛砖引玉锦上添花好书推荐总结 前言 作为一名Java开发工程师&#xff0c;不管是校招还是社招jvm一定是必问必会的知识点。虽然说真正开发中用到的不多&#xff0c;甚至可以说用不到&#xff08;对于刚入行或者Java初级&#xff09;&#xff0c;但是当面试…

Redis实现API访问频率限制

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

ffmpeg、ffplay在线安装,离线导出整个程序,移植到其他服务器使用(linux系统)

环境说明 以ubuntu系统作为说明 在线安装 下面命令会同时安装ffplay和ffmpeg sudo apt-get install ffmpeg怎么验证安装成功&#xff1f; 输入ffmpeg命令 ffmpeg&#xff0c;如图则说明安装成功 转储可执行程序和依赖的文件 找到安装路径&#xff0c;一般在/usr/bin目录…

Neo4j 与 Cypher 基础

更好的阅读体验 \huge{\color{red}{更好的阅读体验}} 更好的阅读体验 简介 Neo4j 是用 Java 实现的开源 NoSQL 图数据库。从2003年开始开发&#xff0c;2007年正式发布第一版&#xff0c;其源码托管于 GitHub。 与常见的关系型数据库不同&#xff0c;Neo4j 基于图图结构来表示…

10.01

服务器 #include<myhead.h> //键盘输入事件 int keybord_events(fd_set readfds) {char buf[128] "";int sndfd -1; //从终端获取一个文件描述符&#xff0c;发送数据给该文件描述符对应的客户端bzero(buf, sizeof(buf));int res scanf("…

CSP-J第二轮试题-2020年-1.2题

文章目录 参考&#xff1a;总结 [CSP-J2020] 优秀的拆分题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示样例 1 解释数据规模与约定 答案1答案2 [CSP-J2020] 直播获奖题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 …

AI伦理与机器道德:人工智能的道德挑战

文章目录 什么是AI伦理和机器道德&#xff1f;1. 隐私保护2. 歧视和不平等3. 透明度和解释性4. 安全性5. 社会影响 AI伦理和机器道德的重要性1. 保护个人权利2. 避免不平等和歧视3. 保持透明和责任4. 促进创新 AI伦理挑战和解决方案1. 隐私保护2. 歧视和不平等3. 透明度和解释性…

C++八股

1、简述一下C中的多态 在面向对象中&#xff0c;多态是指通过基类的指针或引用&#xff0c;在运行时动态调用实际绑定对象函数的行为&#xff0c;与之相对应的编译时绑定函数称为静态绑定。 静态多态 静态多态是编译器在编译期间完成的&#xff0c;编译器会根据实参类型来选择…

第80步 时间序列建模实战:GRNN回归建模

基于WIN10的64位系统演示 一、写在前面 这一期&#xff0c;我们使用Matlab进行GRNN模型的构建。 使用的数据如下&#xff1a; 采用《PLoS One》2015年一篇题目为《Comparison of Two Hybrid Models for Forecasting the Incidence of Hemorrhagic Fever with Renal Syndrom…

使用SDKMAN在Linux系统上安装JDK

本文使用的Linux发行版为Rocky Linux 9.2&#xff0c;可以当做CentOS的平替产品。 SDKMAN是一个sdk包管理工具&#xff0c;通过自带的命令可以快速切换软件环境&#xff0c; 官网地址&#xff1a;https://sdkman.io/。 1、安装sdkman&#xff1a; # curl -s "https://ge…