实现八大排序算法

2023-05-16

八大常用排序实现地址:https://gitee.com/CCTVYI/Algorithm/tree/master/Sort

一、背景

1.稳定性
两个相等的数A和B,倘若在未排序前,A在B的前面,排序后,A排到了B的后面,那么称这个排序算法是不稳定的。

未排序:2,3,A,7,B,8(假设A=B=5)
排序后:2,3,B,A,7,8
//这个算法是不稳定的。

**稳定的:**相等的元素的顺序不会改变。
2.排序种类
内部排序:数据元素放在内存中排序。
外部排序:数据元素太多不能同时放在内存中,需要借助内/外存之间移动数据。以达到排序整个文件的目的。
这里写图片描述

3.表格
这里写图片描述
时间复杂度
**1)**冒泡、选择、直接 排序需要两个for循环,每次只关注一个元素,平均时间复杂度为O(n2)O(n2)(一遍找元素O(n)O(n),一遍找位置O(n)O(n))
**2)**快速、归并、希尔、堆基于二分思想,log以2为底,平均时间复杂度为O(nlogn)O(nlogn)(一遍找元素O(n)O(n),一遍找位置O(logn)O(logn))

二、插入排序

1.直接插入排序
1)背景
类似于抓扑克牌,是最简单的一种排序,将一个记录插入到已排好序的有序表中,从而得到一个新的,记录数增一的有序表。其时间复杂度为O(n2)。空间复杂度O(1)。
2)应用场景
元素较少,一般低于8个,可以使用二分查找进行改进直接插入排序算法。
优点:插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。
缺点:但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。
3)算法思路
先将第一个数和第二个数(Key)比较,Key小,将第一个数搬到后面。然后在寻找位置将其插入。
这里写图片描述
2.希尔排序
1)背景
是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定的排序算法。其时间复杂度为O(n2)。空间复杂度O(1)。希尔排序通过这种策略使得整个数组在初始阶段达到从宏观上看基本有序,小的基本在前,大的基本在后。
2)应用场景
不需要大量的辅助空间,希尔排序没有快速排序算法快 O(n(logn)),因此中等大小规模表现良好,对规模非常大的数据排序不是最优选择。但是比O( )复杂度的算法快得多。并且希尔排序非常容易实现,算法代码短而简单。
这里写图片描述
3)算法思路
①先将序列进行分组,单独分出的组进行直接插入排序,直到分组只剩一个为止。
②gap=gap/3-1,这种步长在实验中效率是最高的,每进行一次直接插入排序,小的基本在前,大的基本在后。
三、选择排序

1.选择排序
1)背景
选择排序是不稳定的算法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换)。
对于数据较多的数组,循环的次数将与数组中元素的个数一致,因此,在对于这种数组进行排序时,将十分的浪费时间。
2)算法思路
第一步:先将最后一个元素默认看成最大的元素。
第二步:从前向后全部遍历,使用变量max记录最大数的下标。
第三步:最大元素和最后一个元素进行交换。

2.堆排序
1)背景
堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值
2)算法思路
第一步:先找到倒数第一个非叶子结点,然后自顶向下进行调整。
第二步:非叶子节点–,在进行第一步,直到非叶子结点走到根结点。
第三步:开始进行堆排序,调整后,最大元素到了堆顶,然后交换首元素和最后一个元素。然后继续调整。
注:如何调整?
自顶向下调整,默认设置左孩子大于右孩子。如果右比左大,则认为右是大孩子,然后父亲与孩子进行比较,如果孩子比父母大,则交换。并更新父亲和孩子节点的下标。

四、交换排序

1.冒泡排序(Bubble_Sort)
第一个数和第二个数进行比较,将大的数放在后面,然后第二个数和第三个数进行比较,也将大的数放在后面,那么这样一趟下来,将最大的元素放在了最后面
第二趟的比较比第一趟少了一次,因为最后的元素已经是最大的了,它没有必要再排序了。
第三趟的比较比第二趟少了二次…
注:
可以添加标志位,经历第一趟,如果交换了元素,就改变标志位,否则不改变。倘若标志位没有改变,那么可以直接退出。

2.快速排序
快排是冒泡排序的改进。是一种不稳定的算法。
1)应用场景
待排序的关键字是随机分布时,快速排序的平均时间最短;
2)快排算法思路
a.比较前的准备:i=第一个元素下标,j=最后一个数的下标,k=第一个元素值。
b.第一遍比较:比较右–>左–>右–>左–>右…,直到(i==j)停下来,此时比K大的和比K小的数分到K的两边。
c.后续比较,利用递归,对k两边的数据,再分组分别进行上述的过程,直到不能再分组为止
这里写图片描述
注:
如果i和j没有碰头的话,就递加i找大的,还没有,就再递减j找小的,如此反复,不断循环。注意判断和寻找是同时进行的。
这里写图片描述
五、归并排序

1.归并排序
1)算法是采用分治法。将已有序的子序列合并,得到完全有序的序列,即先使每个子序列有序,再使子序列段间有序。
2)若将两个有序表合并成一个有序表,称为二路归并
3)是一种稳定的排序算法。速度仅此于快速排序。但比较占内存
2.应用场景
一般用于对总体无序,但是各子项相对有序的数列。
用于多个有序的数据文件归并成一个有序的数据文件
3.归并算法思路
1)重新开辟空间。归并排序后进行释放。
2)递归划分成一个一个子列,递归跳出条件,子列元素小于等于一退出。先划分左,在划分右。
3)归并操作。对于两个有序子列,先将两个子列首元素最小的,放入新开辟的空间中,然后在向后寻找。当其中一个子列无元素后,检测另一个子列是否还有元素,直接追加到新空间后面。并将新空间里的数据移入原空间。
这里写图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实现八大排序算法 的相关文章

  • 马克飞象常用操作(markdown )

  • QT 移入控件展示卡片

    功能 xff1a 移入widget显示卡片 xff0c 并且可以进入卡片不消失 xff08 widget与卡片距离离得很近 xff09 xff0c 移出卡片才离开 span class token keyword bool span spa
  • 树莓派pico入门第一站:让主板上的小灯闪起来。(附代码)

    首先配置你的树莓派pico xff0c 把它插在你的电脑上 xff0c 你的电脑会多出来一个 U盘 xff0c 把这个文件复制 xff0c 粘贴 到你的树莓派pico里面 xff0c 你多出来的 U盘 会自动 消失 xff0c 这时候 xf
  • QT 网格布局插入固定列数的item

    一 场景 在网格布局插入固定列数的item xff0c 比如三列item xff0c 根据item的总数计算 span class token macro property span class token directive hash s
  • QT QMetaEnum枚举与字符串互转

    一 示例 span class token macro property span class token directive hash span span class token directive keyword include spa
  • QT 抓取widget转换为图片

    QString folder span class token operator 61 span span class token class name QStandardPaths span span class token operat
  • window11 安装linux子系统(一键安装)并连接到vs code

    文章目录 一 window 使用linux环境的几种方式二 安装wsl1 进入这个目录下 xff0c 将cmd exe已管理员身份运行2 命令行输入以下命令 xff0c 然后重启计算机3 再次已管理员身份打开 xff0c 执行命令 xff0
  • QT 利用URL Protocol实现网页调起本地程序

    一 QT 安装时脚本注入注册表或者自己添加 span class token comment 依次为目录 键 值 xff0c 34 URL Protocol 34 这个键必须有 span WriteRegStr HKCR span clas
  • PC 配置jenkins自动打包

    文章目录 一 下载jenkins运行环境二 下载jenkins三 安装 qt 5 12 2 和 VS 2017四 安装git并配置gitlab五 jenkins配置git 一 下载jenkins运行环境 java jdk 11 镜像下载地址
  • 心系Flyme

    我来自陕西省神木县 xff0c 大学我考入了陕西科技大学 xff0c 成为了一名信息与计算科学专业的学生 xff0c 希望在以后的道路中 xff0c 通过我自己的努力 xff0c 提升自己的价值 在大二大三学习编程 xff0c 希望自己可以
  • C语言的编译链接过程

    编写的一个C程序 xff08 源程序 xff09 xff0c 转换成可以在硬件上运行的程序 xff08 可执行程序 xff09 xff0c 需要进行翻译环境和运行环境 翻译环境则包括两大过程编译和链接 xff0c 经过编译和链接过程便可形成
  • 函数的调用过程(栈帧的创建和销毁)

    为了更好地认识函数的调用过程 xff0c 我们可以用反汇编代码去理解学习 一 基本概念 1 栈帧 xff08 过程活动记录 xff09 xff1a 是编译器用来实现函数调用的一种数据结构 xff0c 每个栈帧对应一个未运行完的函数 xff0
  • 树莓派pico刚买来怎么用?

    第一次使用 xff0c 首先按住主板上的白色按钮 xff0c 然后另一只手把数据线插在主板上 xff0c 直到你的电脑提示有新设备输入 xff0c 提示可以是声音 xff0c 可以是设备管理器多了一个U盘 要想得到提示 xff0c 你要打开
  • C语言动态顺序表

    顺序表是将表中的节点依次存放在计算机内存中一组地址连续的存储单元中 xff0c 表可以动态增长 xff0c 尾插元素 xff0c 尾删元素 xff0c 头插元素 xff0c 头删元素 xff0c 打印元素 xff0c 查找元素 xff0c
  • C语言笔记1

    假定程序运行环境为VC6 0 xff0c 缺省为四字节对齐 xff0c CPU xff08 32小字节序处理器 xff09 1 char x 61 34 ab0defg 34 char y 61 39 a 39 39 b 39 39 0 3
  • 【C++三大特性】继承

    如有疑问 xff0c 欢迎讨论 xff0c QQ xff1a 1140004920 一 继承的概念 1 原有的类为基类 xff0c 又称父类 xff0c 对基类进行扩展产生的新类称为派生类 xff0c 又称子类 xff0c 继承可以使代码复
  • C++实现顺序表及双向链表

    顺序表 include lt iostream gt include lt assert h gt using namespace std typedef int DataType class SeqList public 默认的构造函数
  • 二叉树

    一 二叉树 是结点的一个有限集合 xff0c 每个根结点最多只有两颗子树 xff0c 二叉树有左右之分 xff0c 子树的次序不能颠倒 二 二叉树的种类 1 满二叉树 xff1a 每个结点都有左右子树 xff0c 且叶结点都在同一层 2 完
  • 进程间通信----管道、消息队列、共享内存、信号量

    一 进程间通信 xff08 Inter Process Communication xff09 1 目的 1 数据传输 2 资源共享 3 通知事件 4 进程控制 注 xff1a 每个进程都有各自不同的用户地址空间 xff0c 进程之间要交换
  • 进程基本概念、进程地址空间

    强调内容今天来谈一谈进程的一些基本概念 xff0c 认识一些进程状态 xff0c 重新认识一下程序地址空间 xff08 进程地址空间 xff09 xff0c 进程调度算法 xff0c 环境变量等属性 一 进程 1 什么是进程 xff1f 程

随机推荐

  • 何为缓存?

    一 缓存 xff08 cache xff09 1 概念 xff1a 数据交换的缓冲区 xff08 称作Cache xff09 缓存是一块内存芯片 xff0c 具有极快的存取速率 xff0c 它是硬盘内部存储和外界接口之间的缓冲器 xff0c
  • 计算机的组成

    一 冯诺依曼系统 1 计算机硬件 由运算器 控制器 存储器 输入设备 输出设备组成 2 计算机内部采用二进制表示指令和数据 3 注 xff1a 1 输入设备 xff1a 键盘和鼠标等 2 输出设备 xff1a 显示屏 xff0c 打印机等
  • fd与FILE以及fork缓冲问题

    一 文件描述符 fd 1 文件描述符其实就是一个非负的小整数 是文件指针数组的下标 2 让我们看一看0 xff0c 1 xff0c 2 xff0c 代表什么 xff1f span class hljs preprocessor includ
  • Kali Linux使用体验简述

    在以前的版本里Kali Linux默认用户是root用户 xff0c 这样设计的目的是避免每次都要输入root密码 xff0c 而如今需要root密码的程序明显少于从前 xff0c Kali Linux也做出了相应的改革 xff0c 默认用
  • 随身WiFi410的板子刷Debian安装青龙面板+狗东脚本最详细教程

    前几天 xff0c 我发布了一个410刷入debian的教程 很多老哥可能觉得刷入debian没有什么用 xff0c 今天我就教大家如何安装青龙面板 xff0c 并且安装脚本实现自动白嫖狗东的豆子 青龙面板 43 狗东脚本 自动领豆子红包
  • inode以及软硬链接

    一 inode 使用ls l查看文件元数据 xff0c 用来描述数据属性 模式 硬链接数 文件所有组 组 大小 最后修改时间 文件名 使用stat查看 xff0c 查看文件信息 span class hljs comment Access
  • 静态库与动态库

    一 库 由于版权原因 xff0c 库函数的源代码一般是不可见的 xff0c 但在暴露的头文件中你可以看到它对外的接口 库函数简介 xff0c 使用的时候 xff0c 直接引入头文件 include lt gt 即可 二 静态库 1 概念 程
  • 【进程控制上】创建、终止、等待、程序替换

    进程的创建 终止 等待 程序替换 以及popen system与fork之间的区别 一 进程的创建 init进程将系统启动后 xff0c init将成为此后所有进程的祖先 xff0c 此后的进程都是直接或间接从init进程 复制 而来 完成
  • 【进程控制下】实现一个简易的shell

    1 shell原理 运用程序替换的原理来实现的 xff0c shell自己就是一个进程 span class hljs number 1 span 获取命令行 span class hljs number 2 span 解析命令行 span
  • VIM的基本使用

    一 VIM 1 概念 是一款文本编辑器 xff0c 和Emacs并列成为类Unix系统用户最喜欢的文本编辑器 2 优点 可以完成复杂的编辑与格式化功能 3 模式 其模式共有十二种 xff0c 基本模式有六种 span class hljs
  • 进程信号

    一 信号概念 1 一个信号产生及处理实例 1 在shell下 xff0c 启动一个进程 2 按下Ctrl 43 c xff0c 键盘输入产生一个硬件中断 3 如果CPU正在运行这个进程则代码暂停执行 xff0c CPU从用户态返回到内核态
  • 进程间关系和守护进程

    一 进程间关系 1 进程组 xff08 Process Group xff09 1 xff09 是一个或多个进程的集合 xff0c 通常 xff0c 这个集合与同一个作业相关联 xff0c 可以接受同一终端的各种信号 2 xff09 每一个
  • 多线程死锁

    一 死锁 1 xff09 提出 多线程与多进程提高了系统资源的利用率 xff0c 然而并发执行也会带来一些问题 xff0c 如死锁 2 xff09 概念 死锁是指两个或两个以上的进程在执行过程中 xff0c 由于竞争资源或者由于彼此通信而造
  • Proxy-Server

    一 摘录 二 背景 由于某些原因 xff0c 在我们国内无法访问google facebook等外国网站 xff0c 如果你想使用外网来学习 xff0c 聊天 xff0c 那么就可以使用一些翻墙代理 三 原理 1 要想翻墙 xff0c 首先
  • 【线程】概念与控制

    线程概念与控制 线程分离 一 线程的概念 1 概念 在一个程序里的一个执行流就叫做线程 xff0c 是一个进程内部的控制序列 线程是调度的基本单位 xff0c 在Linux下 xff0c 线程称为轻量级进程 2 线程与进程之间的区别 1 x
  • 使用Linux能显著降低家用电脑或服务器的功耗?

    就那我家里的电费举例子吧 xff08 心疼 xff09 xff0c 我家上个月电费比平时多了50元 xff08 你能想到50元是都少度电吧 xff1f xff09 xff0c 原因就是就我使用了一个月Linux 这么说Linux能增加电费开
  • 【线程同步与互斥】卖票问题(互斥锁)

    一 简述 1 共享变量 很多变量有时候需要在线程间共享 xff0c 可以通过数据的共享 xff0c 从而完成线程之间的交互 如果变量是只读的 xff0c 多个线程同时读取该变量不会有一致性的问题 xff0c 但是当一个线程可以修改的变量 x
  • 【网络基础】基本协议

    一 协议 1 概念 计算机与计算机之间通过网络实现通信时事先达成的一种约定 两台计算机只要遵循相同的协议就能够实现通信 网络也属于进程间通信 xff0c 公共资源是网络 xff0c 其本质是两个进程通过网络进行收发数据 2 多任务调度 操作
  • 面试必备:”三次握手与四次挥手

    TCP是如何建立连接与断开 xff1f 如何提高可靠性 xff1f 又是如何提高性能的 xff1f 一 TCP的连接与断开 1 连接前的准备 服务端 xff1a 分配文件描述符 gt 绑定 gt 监听 gt 阻塞等待客户端连接 客户端 xf
  • 实现八大排序算法

    八大常用排序实现地址 xff1a https gitee com CCTVYI Algorithm tree master Sort 一 背景 1 稳定性 两个相等的数A和B xff0c 倘若在未排序前 xff0c A在B的前面 xff0c