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

news2024/12/24 20:40:19

目录

本章内容如下  

 一:插入排序              

                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.coloradmin.cn/o/1038799.html

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

相关文章

谈谈最近招人的感受!

最近折腾新的项目&#xff0c;面试了很多实习生小伙伴&#xff0c;我说说我的一些「面试」感受&#xff0c; 虽然是一个老生常谈的话题&#xff0c;但是依然提一下。 准时很重要&#xff1a;提前一点时间&#xff0c;踩个点&#xff0c;别迟到&#xff0c;面试的过程中由于每个…

Python 模拟刮刮乐小游戏

"""刮刮乐小游戏知识点&#xff1a;1、随机模块 random2、嵌套循环 while for3、条件语句/跳转语句 if / continue4、列表添加元素函数 append()"""# 随机模块 import randomwhile True:# 奖品信息prize_info [一等奖, 二等奖, 三等奖, 谢谢惠顾…

交易日均千万订单的存储架构设计与实践 | 京东物流技术团队

一、订单系统概述 1.1 业务范围 服务业务线&#xff1a;快递、快运、中小件、大件、冷链、国际、B2B合同物流、CLPS、京喜、三入三出&#xff08;采购入、退货入、调拨入、销售出、退供出、调拨出&#xff09;等 1.2 订单中心价值 1、解耦&#xff08;提升系统稳定性&#…

基于Spring Boot的房屋租赁系统

目录 前言 一、技术栈 二、系统功能介绍 租客功能模块的实现 ​编辑 管理员功能模块的实现 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 房屋是人类生活栖息的重要场所&#xff0c;随着城市中的流动人口的增多&#xff0c;人们对房屋租赁需求越来越高…

Unity HDR 无线延申的网格效果

无线延申的网格 该项目必须是再HDR项目 shader代码实现 Shader "Unlit/infTutorial1" {Properties{_Alpha ("Alpha", Range(0, 0.5)) 0.5}SubShader{Tags{"RenderPipeline""UniversalRenderPipeline""RenderType""…

【Java】基于物联网技术的智慧工地源码(项目端、监管端、APP端、智慧大屏)

智慧工地是将云计算、大数据、物联网、移动技术和智能设备等信息化技术手段&#xff0c;聚集在建筑工地施工管理现场&#xff0c;围绕人员、机械、物料、环境等关键要素&#xff0c;建立智能信息采集、高效协同管理、数据科学分析、过程智慧预测&#xff0c;最终实现建筑工地的…

工厂漏水怎么预防?教你一招,百试百灵

随着工业化的迅速发展&#xff0c;工厂和生产设施在现代社会中扮演着至关重要的角色。然而&#xff0c;这些设施在日常运营中也面临着各种各样的风险和挑战&#xff0c;其中之一是水浸事件。 水浸事件可能是由于天灾、设备故障、管道泄漏或人为失误等原因引发的&#xff0c;但无…

单片机上软字库换32进制存储,空间占用少20%

在之前的单片机字库建立的推送中: https://blog.csdn.net/platform/article/details/130742775&#xff0c; 存储了GB2312字符集对应的软字库文件&#xff0c;在16*16的编码下总字库的507KB&#xff0c;后来把字体切换成了12*12&#xff0c;软字库缩减到了301KB。当然这里面对…

速卖通商品详情数据接口

速卖通商品详情数据接口&#xff08;aliexpress商品详情API接口&#xff09;可以获取到速卖通商品的详细信息&#xff0c;如商品标题、价格、库存、详情描述、图片等。 速卖通商品详情API接口是速卖通提供的一种产品数据接口&#xff0c;可以帮助速卖通卖家快速地将产品分类、…

一个高效、简洁、轻量的一站式研发管理平台,协作一站式

一、开源项目简介 Codes 是一个 高效、简洁、轻量的一站式研发管理平台。包含需求管理&#xff0c;任务管理&#xff0c;测试管理&#xff0c;缺陷管理&#xff0c;自动化测试&#xff0c;cicd 等功能&#xff1b;Codes 帮助企业加速融合研发、测试、运维一体化进程 常态下,刀…

正态分布的概率密度函数|正态分布检验|Q-Q图

在正态分布的概率密度函数中&#xff0c;自变量 X 是一个随机变量&#xff0c;表示我们要研究或测量的某一现象或事件的取值。正态分布的概率密度函数用来描述这个随机变量的概率分布情况&#xff0c;即在不同取值上的概率密度。 具体来说&#xff0c;对于正态分布的概率密度函…

【PMP/软考】软件需求的三个主要层次:业务需求、用户需求和功能需求解释及实例解析

简述 当进行需求分析时&#xff0c;通常着重考虑三个主要层次&#xff1a;业务需求、用户需求和功能需求。业务需求关注项目与组织战略目标的一致性&#xff0c;用户需求明确最终用户的期望&#xff0c;而功能需求定义具体的系统功能和特性。这三个层次为项目管理和软件工程提…

12款最火的AI画图软件,助你探索创新设计

ChatGPT火爆出圈&#xff0c;AI画图软件也如雨后春笋般流行起来。各类AI画图的软件工具横空出世&#xff0c;设计师与其焦虑工作会不会被人工智能取代&#xff0c;不如践行“工欲善其事必先利其器”&#xff0c;开拓思路&#xff0c;打开格局&#xff0c;好好地探索下如何利用好…

Apache HTTP Server 2.4.49 路径穿越漏洞 (CVE-2021-41773)

Apache HTTP Server 2.4.49 路径穿越漏洞 (CVE-2021-41773) 文章目录 Apache HTTP Server 2.4.49 路径穿越漏洞 (CVE-2021-41773)1 在线漏洞解读:2 环境搭建3 影响版本&#xff1a;4 漏洞复现4.1 执行漏洞核心指令4.2 进行访问使用bp抓包4.3 尝试执行指令4.4 反弹shenll成功 1 …

039:vue中数字货币化快速显示

第039个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

Python程序设计实例 | 爬取机场航班信息

案例中将展示机场官网中航班信息(如机场航班的离港与进港信息)的爬取过程。有兴趣的读者可以在本案例的基础上对数据进一步分析&#xff0c;或是对爬虫做进一步的开发&#xff0c;增加更多功能。 请求、解析、处理数据是通用爬虫的三个步骤&#xff0c;在本案例中&#xff0c;…

一文了解什么SEO

搜索引擎优化 (SEO) 是一门让页面在 Google 等搜索引擎中排名更高的艺术和科学。 一、搜索引擎优化的好处 搜索引擎优化是在线营销的关键部分&#xff0c;因为搜索是用户浏览网络的主要方式之一。 搜索结果以有序列表的形式呈现&#xff0c;网站在该列表中的排名越高&#x…

一个含不少免费额度和数据下载的IP地址来源查询工具

大家好&#xff0c;我是TJ君&#xff01; 如今在国内运营的各种互联网应用都有接入IP来源显示的要求&#xff0c;现在相关API的供应商也很多。今天TJ刚好看到一个不错的&#xff0c;所以马上给大家推荐一下。 这款不错的产品名称为&#xff1a;IPInfo 产品特性 该IP查询工具…

解决 react 项目启动端口冲突

报错信息&#xff1a; Emitted error event on Server instance at:at emitErrorNT (net.js:1358:8)at processTicksAndRejections (internal/process/task_queues.js:82:21) {code: EADDRINUSE,errno: -4091,syscall: listen,address: 0.0.0.0,port: 8070 }解决方法&#xff…

第二证券:美国政府又要“关门”?3万亿市值蒸发!

上星期&#xff0c;欧美股市全线跌落&#xff0c;科技股大跌&#xff0c;纳斯达克指数跌逾3%&#xff0c;苹果、微软、谷歌、亚马逊、英伟达、特斯拉、脸书母公司Meta等七大科技股上星期市值算计削减4615亿美元&#xff08;合人民币3.37万亿元&#xff09;。 本周市场将发布我…