排序算法一 直接插入排序,希尔排序,直接选择排序,堆排序和冒泡排序

news2024/11/16 18:04:29

什么是排序

排序:排序就是使一串记录,按照其中的某个或者某些关键字的大小,递增或递减的排列起来的操作

稳定性: 假定在排序序列中,存在多个具有相同的关键字记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,存在r[i] = r[j],且r[i]在 r[j] 之前,而在排序后的序列中,r[i] 仍在 r[j]之前,则称这种算法排序为稳定的,否则称为不稳定。

内部排序: 数据元素全部放在内存中的排序

外部排序: 数据元素太多,不能同时放在内存中, 根据排序过程中的要求不能再内外存之间移动数据的排序。

插入排序

把待排序的记录按其关键码值的大小逐个插入到一个已经排好的序列中,直到所有的记录插入完为止,得到一个新的有序队列.我们生活中在玩扑克的时候,就用到了直接插入排序的思想。

直接插入排序

代码实现

一张图带你看懂内层循环

看完了代码接下来我们分析一下时间复杂度.在最坏的情况下,每插入一个数据,就要执行j次,那么时间复杂度就为(1+ 2 + 3+...+n) = O(n^2) 。最好的情况下:当我们待插入的数据本来就有序的时候,时间复杂度为O(N)。我们会发现:当元素集合越接近有序,直接插入排序的时间效率越高。

当数据基本有序的时候建议采用直接插入排序。

直接插入排序的空间复杂度O(1).是一种稳定的排序算法。

希尔排序(缩小增量排序)

希尔排序的基本思想是:先须选定一个整数,把待排序文件中所有记录分成多个组,所有距离相同的分在同一个组,并对每一个组内的记录进行排序,然后,重复上述分组和排序的工作,当达到 = 1时,所有记录在同一个组内并排好序。

图形展示

希尔排序是一种特殊的直接插入排序,直接插入排序的时间复杂度为O(N^2),在希尔排序中,分的组数越多,每组的数据就越少,O(N^2)也很小,在继续分组的时候,数据就会趋近与有序,组数少,数据多,当gap = 1时,就相当于直接插入排序。

代码实现

希尔排序的总结:

1 希尔排序是对直接插入排序的优化

2 当 gap > 1时,都是预排序,目的是让数组趋近于有序,当gap == 1时,数组已经趋近有序,这样就会很快.对整体而言,可以达到优化的效果

3 希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难计算.导致好多书中给出的希尔排序时间复杂度都不固定

选择排序

思想:  每一次从待排序序列的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完.

动图演示 :

直接选择排序

直接选择排序的特性总结

1  直接选择排序的效率不是很高(不论数组中的数据是否有序,都会执行完所有步骤)

2  时间复杂度  O(N^2)

3  空间复杂度  O(1)

4 稳定性:不稳定

根据上面代码,我们想想还有没有其其它的思路, 我们可以在一次遍历中找到最大值和最小值,定义left = 0 ;rigtht = array.length - 1 ,每遍历一次,让最小值交换到left的位置,让最大值交换到right为止.但 当最大值的位置等于left的时候,在这里面有一个小小的bug.

这种方法虽然一次可以交换两个数,但时间复杂度没变,还是O(N^2).

堆排序

关于堆的性质和如何创建大跟堆,小根堆请看我的另外一篇博客,那里面有很详细的讲解

堆的基本操作和堆的创建方法

堆排序的动图演示

堆排序的代码还是比较复杂的,需要对堆的一些性质和堆的创建方法有一定的了解

public void heapSort(int[] array) {
        createBigHeap(array);
        int end = array.length - 1;
        while(end > 0) {
            swap(array,0,end);
            shiftDown(array,0,end);;
            end--;
        }
        
    }
    //建大根堆
    private void createBigHeap(int[] array) {
        for(int parent = (array.length - 1- 1)/2; parent >= 0; parent--) {
            shiftDown(array,parent,array.length);
        }
    }
    //向下tiaoz
    private void shiftDown(int[] array,int parent,int len) {
        int child = 2*parent + 1;
        while(child < len) {
            if(child + 1 < len && array[child] < array[child+1]) {
                child++;
            }
            if(array[child] > array[parent])  {
                swap(array,child,parent);
                parent = child;
                child = 2*parent + 1;
            }
            else {
                break;
            }
        }
    }
    //交换
    private void swap(int[] array,int i,int j) {
        int tmp = array[i];
        array[i] = array[j];
        array[j] = tmp;
    }

堆排序的特性总结 

堆排序的时间复杂度 O(N * log₂ N)

空间复杂度:  O(1)

稳定性:  不稳定的排序.

交换排序

交换排序就是根据序列中两个元素的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将元素较大的的记录向序列的尾巴移动,较小元素向序列的前面移动

冒泡排序

根据动图我们可以看出每遍历一次,至少有一个元素的序列是排好了的,,我么可以引入一个布尔变量flag,用来标记相邻元素是否交换,若在一次遍历中,flag的值没变,说明这组序列已经排好序.

冒泡排序的特性总结

时间复杂度: O(N^2)

空间复杂度: O(1)

稳定性 : 稳定的排序

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

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

相关文章

Oracle-通过BBED强制打开数据库

前言: 在通过备份进行数据恢复时&#xff0c;经常会遇到由于备份的不完整&#xff0c;特别是归档日志的缺失&#xff0c;导致虽然数据文件已经顺利恢复&#xff0c;但是数据文件的恢复时间点没有完全一致或者数据文件的fuzzy的状态不一致&#xff0c;从而数据库无法正常的打开&…

三维模型3DTile格式轻量化压缩处理重难点分析

三维模型3DTile格式轻量化压缩处理重难点分析 在对三维模型3DTile格式进行轻量化压缩处理的过程中&#xff0c;存在一些重要而又困难的问题需要解决。以下是几个主要的重难点&#xff1a; 1、压缩率和模型质量之间的平衡&#xff1a;压缩技术的目标是尽可能地减少数据大小&…

用CRM系统提高客户转化率

影响客户转化的因素有很多&#xff0c;例如潜在客户是否真实有效、销售跟进策略、销售跟进流程和及时性等。不少企业正在使用CRM销售管理系统&#xff0c;下面说说CRM系统如何提高提高客户转化率&#xff1f; 1、甄别高质量获客渠道 CRM系统可以对获取的客户线索进行分析&…

premire 两个视频叠加显示

1 背景视频放到 v1 视频轨道 前视 视频 放到 v2 视频轨道 2 调整 前视 视频颜色参数 2.1 曲线 亮度 暗度 调整 黑白鲜明对比 2.2 基本校正 对比度 白色 黑色 饱和度 曝光 3 效果控件 -> 混合模式 -> 滤色 4 视频人物大小调整 位置调整

基于微信小程序的宠物交易商城系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言运行环境说明用户的主要功能有&#xff1a;管理员的主要功能有&#xff1a;具体实现截图详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考论文参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌…

电设备工厂的BOM管理系统

一、什么是BOM管理系统&#xff1f; BOM管理系统是一种软件工具&#xff0c;用于管理和跟踪产品的物料清单。它包括产品的组成结构、零部件的规格、数量和关联信息。BOM管理系统提供了一个集中存储和更新BOM数据的平台&#xff0c;并确保所有相关部门和团队都能够访问最新的BO…

2023工博会 | 上海添力网络营销公司 | 助力工业品线上推广

2023年9月23日&#xff0c;为期五天的工博会正式落下帷幕。本届工博会不仅有数量&#xff0c;更加有质量&#xff0c;国内外企业纷纷拿出看家本领&#xff0c;围绕着“绿色低碳”、“数字化转型”、“数字经济”、“科技创新”、“智能制造”等主题进行推陈出新。 本次工博会也…

未来预判:跨境电商全球化的下一个步伐

在当今全球化的时代&#xff0c;跨境电商已经成为了国际贸易和全球商业的主要驱动力之一。跨境电商不仅仅改变了消费者的购物方式&#xff0c;也对传统零售业产生了深远的影响。 然而&#xff0c;随着技术和市场的不断发展&#xff0c;跨境电商也在不断演化&#xff0c;其全球…

2023 现阶段H5的机型适配

个人愚见 现在的主流体验&#xff0c;是大屏手机展示更多的内容&#xff0c;并不着重于放大展示&#xff0c; 所以&#xff0c;外层布局使用vw,百分比&#xff0c;flex&#xff0c;内层直接px就行 参考&#xff1a; https://juejin.cn/post/7128051145431318535

LoadLibraryEx调用dll时有未经处理的异常,发生访问冲突

0x000000000006A220 处的第一机会异常(在 testHFHZDll.exe 中): 0xC0000005: 执行位置 0x000000000006A220 时发生访问冲突。 0x000000000006A220 处有未经处理的异常(在 testHFHZDll.exe 中): 0xC0000005: 执行位置 0x000000000006A220 时发生访问冲突。 最近做一个测试&#…

Matlab论文插图绘制模板第116期—带时间刻度的图

之前的文章中&#xff0c;分享了Matlab带线标记的图&#xff1a; 带阴影标记的图&#xff1a; 带箭头标记的图&#xff1a; 带图形标记的图&#xff1a; 带Latex公式的图&#xff1a; 进一步&#xff0c;分享一下带时间刻度的图&#xff0c;先来看一下成品效果&#xff1a; 特别…

步力宝科技爆款产品定位,开创智能物联网新商业

数据显示&#xff0c;中国处于 “亚健康”状态人口数量约占总人口的70%&#xff0c;亚健康是一种临界状态&#xff0c;指介于健康和疾病之间的状态。亚健康是一个动态演变的过程&#xff0c;既有向慢病发展的趋势&#xff0c;也能通过合理的干预使人体重返健康状态&#xff0c;…

垃圾收集器G1ZGC

G1收集器(-XX:UseG1GC) G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征. ​ ​ G1将Java堆划分为多个大小相等的独立区域&#xff08;Region&#xff09;&#…

1、Kafka 安装与简单使用

第 1 章 Kafka 概述 1.1 定义 Kafka传统定义&#xff1a; Kafka是一个分布式的基于发布/订阅模式的消息队列&#xff08;Message Queue&#xff09;&#xff0c;主要应用于大数据实时处理领域。 Kafka最新定义 &#xff1a; Kafka是 一个开源的 分 布式事件流平台 &#xff08…

【AIGC】只要10秒,AI生成IP海报,解放双手!!! | 京东云技术团队

看完这篇文章&#xff0c;你将学会以下价值连城的内容 1、云端部署&#xff08;配置不行的小伙伴看&#xff09; 云端模型放置位置 2、本地部署&#xff08;配置达标的小伙伴看&#xff09; 3、运用SD训练IP的流程和技巧&#xff08;LoRA篇&#xff09; 4、运用SD稳定生成高…

【C语言】指针与动态内存

文章目录 1. 使用动态内存的意义2. 动态内存分配函数2.1 malloc2.2 free2.3 calloc2.4 realloc 3. 动态内存会被自动释放吗&#xff1f;4. 涉及动态内存常见的错误使用4.1 对NULL指针的解引用操作4.2 未对开辟的动态内存空间初始化4.3 越界访问4.4 对非动态开辟内存使用free释放…

vue-cli项目打包体积太大,服务器网速也拉胯(100kb/s),客户打开网站需要等十几秒!!! 尝试cdn优化方案

一、首先用插件webpack-bundle-analyzer查看自己各个包的体积 插件用法参考之前博客 vue-cli项目中&#xff0c;使用webpack-bundle-analyzer进行模块分析&#xff0c;查看各个模块的体积&#xff0c;方便后期代码优化 二、发现有几个插件体积较大&#xff0c;有改成CDN引用的…

解决github 2FA验证

安装谷歌浏览器插件 身份验证器 https://chrome.google.com/webstore/detail/authenticator/bhghoamapcdpbohphigoooaddinpkbai 安装后点击这里后&#xff0c;选中github网页提供的二维码&#xff0c;插件会生成一个code&#xff0c;粘贴到github网页需要输入code的地方 验证…

Visual Studio 删除行尾空格

1.CtrlH 打开替换窗口&#xff08;注意选择合适的查找范围&#xff09; VS2010: VS2017、VS2022: 2.复制下面正则表达式到上面的选择窗口(注意前面有一个空格)&#xff1a; VS2010: $ VS2017、VS2022: $ 3.下面的替换窗口不写入 VS2010: VS2017、VS2022: 4.点选“正则表达式…

UE4蓝图

1、绑定蓝图到对象并打印对象名称 2、变量数值 3、变量字符串 4、侧边栏 5、分支判断 6、倒计时停止 7、每隔一秒执行一次 8、倒计时按条件执行 9、多按键阻断、重置 10、门的状态&#xff1a;开、关、开关 11、一个键盘事件完成多个事件 12、随机抽奖 13、分:秒计时器&#x…