数据结构总结6:八大排序

news2024/11/19 6:28:18

后续会有补充

排序

排序:按照某个或某些关键字的大小,递增或递减排列起来的操作。

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

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

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

常见的排序算法

常见的排序算法有:

        插入排序:直接插入排序

                          希尔排序

        选择排序:选择排序

                          堆排序

        交换排序:冒泡排序

                          快速排序

        归并排序:归并排序

常见排序算法的实现:

插入排序

直接插入排序是一种简单的插入排序法,其基本思想是:

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

直接插入排序

当插入第i个元素时,前面(i-1)个数据都已经排好序,此时用第i个元素的排序码与前面的所有元素的排序码依(i-1),(i-2)......的顺序进行比较,找到插入位置即将该元素插入,原来该位置上的元素顺序后移

插入排序的特性总结:

        1.元素集合越接近有序,直接插入排序算法的时间效率越高

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

        3.空间复杂度:O(1),它是一种稳定的排序算法

        4.稳定性:稳定

希尔排序

希尔排序法又称缩小增量法。

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

希尔排序的特性总结:

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

        2.当gap > 1时,都是预排序,目的是让数组更接近于有序。当gap==1时,数组已经接近有序了,这样就会很快。这样整体而言,可以达到优化的效果,我们实现以后可以进行性能测试对比

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

        4.稳定性:不稳定

选择排序

选择排序

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

直接选择排序

1.在元素集合array[i]到array[n-1]中选择关键码最大(小)的数据元素

2.若它不是这组元素中的最后一个(第一个)元素,则它与这组元素中的最后一个(第一个)元素交换

3.在剩余的array[i]到array[n-2](array[i+1]到array[n-1])集合中,重复上述步骤,知道集合剩余1个元素

直接选择排序的特性总结:

        1.直接选择排序思考非常好理解,但效率不是很好,实际中很少使用

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

        3.空间复杂度:O(1)

        4.稳定性:不稳定

堆排序

堆排序是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆来进行选择数据。需要注意的是排升序要建大堆,排降序要建小堆。

直接选择排序的特性总结:

        1.堆排序使用堆来选数,效率高了很多

        2.时间复杂度:O(N*logN)

        3.空间复杂度:O(1)

        4.稳定性:不稳定

交换排序

基本思想:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置

交换排序的特点:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动

冒泡排序

冒泡排序的特性总结:

        1.冒泡排序是一种非常容易理解的排序

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

        3.空间复杂度:O(1)

        4.稳定性:稳定

快速排序

快速排序是一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。

// 假设按照升序对array数组中[left, right)区间中的元素进行排序

void QuickSort(int array[], int left, int right)

{

if(right - left <= 1)

return;

// 按照基准值对array数组的 [left, right)区间中的元素进行划分

int div = partion(array, left, right);

// 划分成功后以div为边界形成了左右两部分 [left, div) 和 [div+1, right)

// 递归排[left, div)

QuickSort(array, left, div);

// 递归排[div+1, right)

QuickSort(array, div+1, right);

上述为快速排序递归实现的主框架,发现与二叉树前序遍历规则非常像,同学们在写递归框架时可想想二叉

树前序遍历规则即可快速写出来,后序只需分析如何按照基准值来对区间中数据进行划分的方式即可。

将区间按照基准值划分为左右两半部分的常见方式有:

1.hoare版本

2.挖坑法

3.前后指针版本

快速排序优化:

1.三数取中法选key

2.递归到小的子区间时,可以考虑使用插入排序

快速排序的特性总结:

1.快速排序整体的综合性能和使用场景都是比较好的,所以才敢叫快速排序

2.时间复杂度:O(N*logN)

3.空间复杂度:O(logN)

4.稳定性:不稳定

归并排序

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 归并排序核心步骤:

1.分解

2.合并

归并排序的特性总结:

1.归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题

2.时间复杂度:O(N*logN)

3.空间复杂度:O(N)

4.稳定性:稳定

非比较排序

思想:计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用。

操作步骤:

1.统计相同元素出现次数

2.根据统计的结果将序列回收到原来的序列中

计数排序的特性总结:

1.计数排序在数据范围集中时,效率很高,但是适用范围及场景有限

2.时间复杂度:O(MAX(N, 范围))

3.空间复杂度:O(范围)

4.稳定性:稳定

 

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

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

相关文章

如何完美卸载VS2015(2023年5月份实测有效)

使用控制面板卸载VS2015&#xff0c;出现正在配置您的系统&#xff0c;这可能需要一些时间&#xff0c;然后就出现卡住半个小时第二行的条都没有动的问题&#xff0c;这里提供vs2015以及以前版本的卸载方式 问题产生原因:他需要下载一些东西&#xff0c;然后由于你懂的网络原因…

基于yolov3训练自己的数据集

训练数据集的教学视频链接 42. 第六章&#xff1a;基于YOLO-V3训练自己的数据集与任务_哔哩哔哩_bilibili 数据打标签 下载labelme标注工具 通过pip install labelme下载&#xff0c;打开anaconda prompt&#xff0c;切换到下载labelme的环境&#xff08;我的是pytorch&…

torch显存分析——如何在不关闭进程的情况下释放显存

torch显存分析——如何在不关闭进程的情况下释放显存 1. 基本概念——allocator和block2. torch.cuda的三大常用方法3. 可以释放的显存4. 无法释放的显存&#xff1f;5. 清理“显存钉子户” 一直以来&#xff0c;对于torch的显存管理&#xff0c;我都没有特别注意&#xff0c;只…

ffmpeg mkv 文件解析

一、mkv的文件组织 1. EBML基本单元 EBML组成mkv文件最基本的单元&#xff0c; 也是解析文件最小的一个粒度。EBML基本元素结构&#xff1a; ID&#xff1a;标志着这个EMBL 是一个什么类型的&#xff0c;类型决定了后面data中存储的是什么类型的数据如是int&#xff0c;string…

腾讯云备案限制条件说明(必看)

腾讯云网站备案要求首先你有一个需要备案的域名&#xff0c;域名实名认证信息和备案主体相同&#xff1b;在腾讯云有一台符合备案条件的云服务器、轻量应用服务器等云产品&#xff1b;然后根据备案主体所在省份地区&#xff0c;符合当地的通信管理局要求。下面腾讯云百科来详细…

Centos7系统常用命令

一、防火墙firewalld、sestatus 1 查看防火墙状态&#xff1a;systemctl status firewalld 2 关闭运行的防火墙&#xff1a;systemctl stop firewalld.service 开启运行的防火墙&#xff1a;systemctl start firewalld.service 3 禁止防火墙服务器&#xff1a;systemctl di…

如何一行代码实现 OpenAI 可观测,大幅提升使用体验

作者&#xff5c;观测云 徐季秋 现在基于 OpenAI 的 Chat 应用井喷&#xff0c;但给开发者带来了两个难点&#xff0c;一是因为 OpenAI 基于 tokens 的计费机制导致不容易规划消费&#xff1b;另一是 OpenAI 提供的调用本身不稳定&#xff0c;很难分辨是传参错误或是访问失败。…

flume 进阶 Ganglia 部署(十二)

规划安装 hadoop100: web gmetad gmod epel-release hadoop101: gmod epel-release hadoop102: gmod epel-release 安装 三台都安装 sudo yum -y install epel-releasesudo yum -y install ganglia-gmond在hadoop100安装 sudo yum -y install ganglia-gmetadsudo yum -y i…

RT-Thread 2. GD32在 RT-Thread Nano上添加控制台与 FinSH

本篇文档分为两部分&#xff1a; 第一部分是添加 UART 控制台&#xff08;实现打印&#xff09;&#xff1a;用来向控制台对接的终端输出打印信息&#xff1b;该部分只需要实现两个函数&#xff0c;串口初始化和系统输出函数&#xff0c;即可完成 UART 控制台打印功能。 第二部…

sonarqube上的webAPI如何调用?-暴躁了一天调通了

首先吐槽一句&#xff0c;官方API文档给了个寂寞&#xff0c;调不通啊&#xff0c;然后查各种搞了一天&#xff0c;竟然没有一篇文章能把这件事写清楚&#xff0c;给我暴躁的。 结论竟然是原来是我不会调用接口。。。我今天非要把这篇文章写好。 web接口入口 通过sonarqube下…

QT开发实战-动态壁纸软件

动态壁纸软件开发 项目源代码在下面链接获取: ----------------------------- 开发者:CodeSharkSJ 希望此项目能加强你对Qt的应用 文章目录 项目图与开发环境核心技术原理自定义窗口程序UI布局背景绘制样式表基本实现QWebEngineQMedia使用系统托盘隐藏记忆功能应用程序打包 …

四年巨亏49亿,第四范式四闯IPO

深陷亏损的AI公司第四范式&#xff0c;四闯IPO&#xff01; 4月24日&#xff0c;决策类AI独角兽北京第四范式智能技术股份有限公司&#xff08;下称“第四范式”&#xff09;再次更新招股书&#xff0c;继续向港交所发起上市冲击。 第四范式是一家专注于提供以平台为中心的人…

(9) 线性回归

文章目录 1 多元线性回归LinearRegression1.1 基本原理1.2 linear_model.LinearRegression 2 回归类的模型评估指标2.1 是否预测了正确的数值2.2 是否拟合了足够的信息 3 岭回归与Lasso回归3.1 多重共线性3.2 岭回归3.2.1 linear_model.Ridge3.2.2 选取最佳的正则化参数 α \al…

车载以太网-FlexRay

摘要&#xff1a; 到底什么是FlexRay&#xff1f; 1. FlexRay是什么&#xff1f; 那么到底什么是FlexRay&#xff1f;往简单了说&#xff0c;就是CAN总线加LIN总线混合起来排个课程表、提个速再加个冗余。像LIN一样基于TDMA&#xff0c;提高了协议的复杂度&#xff0c;拥有静态…

【linux】挖矿病毒nanominer伪装成python占用服务器GPU的查杀记录

病毒表现 gpustat -cpu 可以看到root用户将GPU的核心跑满了每个占用都是100%&#xff0c;显存吃了6G多。 nvidia-smi 不能正常显示GPU被哪些进程占用 ![在这里插入图片描述](https://img-blog.csdnimg.cn/780f90080a084a44ac59227e384f985b.png 病毒文件分析 在/tmp/.x/…

win10 vmware虚拟机蓝屏怎么办 win10 vmware虚拟机蓝屏解决方法【详解】

最近有朋友出现win10 vmware虚拟机蓝屏的情况应该怎么办&#xff1f;小伙伴们在使用vmware虚拟机出现了蓝屏现象的小伙伴们不用担心&#xff0c;小编翻阅各种资料后给大家带来两种虚拟机蓝屏的解决方法&#xff0c;想要解决此问题的小伙伴们快跟着小编往下看吧&#xff01; win…

三分钟看懂JDK、JRE和JVM的区别和联系

节选自JavaGuide(Github 标星 134k star!「Java学习 + 面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识) JVM Java 虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同…

腾讯云轻量应用服务器卡死怎么连接?

腾讯云轻量云服务器卡死怎么解决&#xff1f;使用腾讯云自带的VNC登录连接轻量服务器&#xff0c;或使用腾讯云OrcaTerm一键免密登录轻量实例。如果是确定数据没问题&#xff0c;也可以使用控制台自带的重启实例。 腾讯云轻量应用服务器参考&#xff1a;https://curl.qcloud.co…

5月18号软件资讯更新合集.....

JTopCMS V4 更新&#xff1a;静态发布功能优化 适配版本&#xff1a;V4.6 介绍 &#xff1a; 本次更新对静态发布 HTML 功能进行多个重要优化&#xff0c;支持全站增量模式发布&#xff0c;支持跨站级栏目联动发布&#xff0c;增加定时发布指定栏目范围&#xff0c;增加栏目对…

php对接阿里云API调用企业税号查询的高级实战案例解析(下拉筛选查询、远程调用API、xm-select组件应用)

阿里云API调用企业税号查询 一、功能描述1.请求参数2.GET请求代码3.返回示例4.错误码 二、核心代码1.引入外部JS库2.构建HTML容器3.xmSelect回调 总结 一、功能描述 企业税号查询-公司税号查询-企业公司开票信息查询-企业营业执照信息查询-工商信息查询-企业基本信息查询&…