七种经典排序算法小记

2023-11-04

首先要感谢MoreWindows的心得分享。通过他的文章,我更深入了解了这七种排序算法的思路。同时,也自己揣摩,手动敲代码实现了这些算法。为了加深理解,又给每一行代码加了注释。
在此,特记下学习这七种排序算法的过程和心得。

补充:冒泡排序、直接选择排序、直接插入排序、希尔排序、快速排序、归并排序、堆排序。

一、参考文献

MoreWindows 大牛的文献库

静默星空 大牛的文献库

本人学习排序算法过程中的测试代码+详细注释+性能测试报告(怎么不能免费下载了,最低1积分?)

二、结合参考文献学习后的心得

1、冒泡排序
遍历数组,通过比较相邻两个数,使大数在后。重复n-1次,可以使数组有序。

1、冒泡排序改进1
在冒泡排序经典的基础上,判断每一次遍历是否发生了数据交换。若有,则说明数据依然无序。若没有,则说明数组已经有序。

1、冒泡排序改进2
在冒泡排序改进1的基础上,在每一次遍历中,记录最后一次发生数据交换的位置endPos,下一次遍历忽略endPos之后的数。

2、直接选择排序
将数组分为有序区和无序区,初始有序区长度为0,无序区长度为n。然后,从无序区中找出最小数,与无序区首位置交换。这样,该首位置也就归入有序区。有序区长度加1,无序区长度减一。重复n-1次,可以使数组有序。

3、直接插入排序
将数组分为有序区和无序区,初始有序区长度为1,无序区长度为n-1。然后,将无序区的第一个数插入到有序区的合适位置,使有序区依然有序。这样,有序区长度加一,无序区长度减一。重复n-1次,可以使数组有序。

3、经典直接插入排序具体做法
在有序区中,从尾向头找一个位置pos,使左边的数小于无序区第一个数;
将无序区第一个数缓存到temp;
将有序区中pos及之后的数向后平移一位;
将temp赋值到pos位置;
有序区长度加一,无序区长度减一,重复之前步骤,直到无序区长度为0;

3、改进直接插入排序具体做法
将无序区第一个数缓存到temp;
在有序区中,从尾向头遍历数组,若当前数大于temp,则当前数向后平移一位。若当前数
小于temp,则将temp赋值到当前数后一个位置;
有序区长度加一,无序区长度减一,重复之前步骤,直到无序区长度为0;

4、希尔排序
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

4、希尔排序具体做法
初始增量gap = 数组长度n / 2 ,将数组中,所有 距离为 gap的倍数 的数分为一组,对每组使用直接插入排序算法排序。然后,更新增量gap = gap/2,重复分组-排序过程。直到增量gap为1,进行最后一次排序,可以使数组有序。

5、快速排序
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

6、归并排序
先使每个子序列有序,再使子序列段间有序。
疑惑:代码中,合并两个子序列时,使用memcpy把临时缓存拷贝到目标内存,排序结果错误。

7、堆排序
将数组调整成大顶堆结构。然后,堆顶与堆尾数据交换。堆节点数“减一”,从根节点调整堆。重复n-1 次,数组有序。

三、性能比较(仅供参考)

排序对象:50000个随机数(随机数种子相同)
快速排序 > 希尔排序改进1 > 归并排序 > 堆排序 > 希尔排序经典 > 插入排序经典> 直接选择排序 > 冒泡排序经典

大礼包
测试代码+详细注释+性能测试报告

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

七种经典排序算法小记 的相关文章

  • pidstat命令详解

    一 命令介绍 pidstat是sysstat工具中的一个命令 用于监控进程的cpu 内存 线程 IO及上下文切换等系统资源的占用情况 格式 pidstat options
  • SpringCloud-注册中心简单了解与使用

    前言 什么是SpringCloud 什么是微服务 能干什么 为什么要用SpringCloud 注册中心 什么是SpringCloud 大家都知道SpringCloud是一种微服务架构 模式 SpringCloud简单来说就是微服务架构技术落
  • ArrayList非线程安全记录

    一 问题描述 线上一个查询服务 偶尔会报一次查询出来的结果集合包含null 二 问题排查 在多线程查询过程中 使用了ArrayList 多线程查询出来后执行ArrayList add 然而ArrayList并不是线程安全的集合 会导致nul
  • linux红帽8怎么安yum,RedHat Linux 8本地Yum源配置方法

    1 挂载系统光盘到 mnt cdrom目录 mkdir p mnt cdrom mount dev sr0 mnt cdrom 2 设置系统启动后将光盘自动挂载到 mnt cdrom echo dev sr0 mnt cdrom iso96

随机推荐

  • 电商数据分析实战第一篇——客户消费行为分析

    一 分析背景 为了提高店铺的收益 进行准确的客户运营策略 使用店铺201910至202002的销售数据进行分析 根据客户的消费趋势 消费习惯把握客户的消费现状和心理 挖掘出高价值用户群体 完善销售运营策略 简单说明一下 客户分析包括基本属性
  • Upload LABS Pass-8

    第八关在后端使用了黑名单 并过滤了大小写 点以及空格 但并未过滤数据流 我们使用代理拦截请求 在文件后缀名中添加数据流 绕过黑名单 准备一个 8 php 文件 内容为一句话木马 上传 8 php 文件 并使用代理 此处使用 Burp Sui
  • JSON对象转换成字符串 相互转换 的几种方式

    在最近的工作中 使用到JSON进行数据的传递 特别是从前端传递到后台 前台可以直接采用ajax的data函数 按json格式传递 后台Request即可 但有的时候 需要传递多个参数 后台使用request进行接收 有时传递了几个数值 还好
  • 嵌套和递归使用模板类

    嵌套和递归使用模板类 模板栈 模板数组 栈中嵌套数组 数组中嵌套栈 数组中嵌套数组 模板栈 pragma once include
  • 计算机网络——网络层

    这篇文章是计算机网络系列文章的第三篇 计算机网络 物理层 计算机网络 数据链路层 计算机网络 网络层 计算机网络 传输层 计算机网络 应用层 序言 计算机网络中的网络层在当今的社会起到了什么作用 现在的互联网通信 远程办公和远程教育 电子商
  • 基于Dragonboard 410c进行开发的远程遥控机器人(三)

    前面说过 买的camera的夹层板要直接连到410c开发板上 这样96boards 就没有接口去连接了 无奈 智能自己飞线了 开始还担心 这样连接板子会不会出问题 经过最终的验证 发现是可以的 完全没有影响 接下来看一下最后的验证 图 远程
  • 安卓keytool获取不到签名文件的MD5

    目前通过 keytool list v keystore xxx jks 这种方法获取签名的md5时 只能显示SHA1和SHA256 不显示md5 解决办法 1 先将自己的keystore配置进app下的build gradle中 2 打开
  • 关键字参数和可选参数

    通常Fortran的实参和形参的参数数量以及类型必须是匹配的 但是如果过程接口是显式的 那么就可以改变参数表中调参数的顺序 或为过程的某些iochengde形参特别指定实参 通过将过程放在模块中 并在调用程序中用use关联访问模块 可以显式
  • C#中的BeforeFieldInit

    今天学习设计模式中的单例模式 无意间发现了这个标志BeforeFieldInit 于是简单地搜索了一下 总结出如下内容 The C specification states The static constructor for a clas
  • Doris--基础--11--动态分区

    Doris 基础 11 动态分区 1 介绍 对表级别的分区实现生命周期管理 TTL 减少用户的使用负担 1 1 功能 动态添加分区 动态删除分区 1 2 原理 在某些使用场景下 用户会将表按照天进行分区划分数据 在没有动态分区功能的时候 用
  • 2021第十二届蓝桥杯大赛软件赛省赛C/C++ 大学B组试题B杨辉三角形

    这题目很简单 问题是细节处理处理很重要 在蓝桥杯省赛中你只要搞对一两道题目就有省三了 实施代码 include
  • 做PPT设计半年赚8万,我是怎样做到的?

    下班做PPT 半年赚8万是什么感觉 你好 我是佳佳 一个用PPT兼职赚钱的宝妈 我现在每天抽2个小时 坐在电脑前 把各种素材像拼图一样拼接一下 像这样 然后把成稿投稿到设计平台 就能赚到钱 你是不是觉得 我是个职业设计师 挺厉害的 不是的
  • java 抽象类初始化_java-抽象类初始化

    我有一个抽象类 abstract class Shape public String color public Shape public void setColor String c color c public String getCol
  • 脚本自动化部署docker微服务,取代Jenkins

    由于Jenkins容器化部署 容器容器之间拷贝文件及其繁琐 如果在Jenkins部署在系统外层也需要配置复杂的流程才能实现微服务的自动化部署 本文主要通过脚本方式取代Jenkins实现自动化部署 脚本方式简单快捷 可以快速实现微服务部署 升
  • MyBatis 快速学习01:第一个程序

    目录 MyBatis简介 什么是MyBatis 为什么需要MyBatis MyBatis框架部署 项目目录结构 搭建实验数据库 创建maven项目 添加mybatis依赖 编写mybatis配置文件 编写MyBatis工具类 创建实体类 编
  • 旧版本Ubuntu安装magick出现undefined symbol的解决思路

    太长不看版 magick的安装需要底层的imagemagick支持 Ubuntu16 04由于版本老旧 安装的旧版imagemagick无法使用 使用spack自己安装新版 可以解决编译问题 果子老师向我求助 让我帮忙安装一个R包 magi
  • 与或非逻辑符号_基本逻辑运算

    今天我给大家分享的是逻辑运算 因为在实际中 我们遇到的逻辑问题是多种多样的 所以我跟大家唠叨一下我自己对逻辑运算的理解分享给各位 逻辑运算 与运算 与运算就是相当于乘法口诀 两个数相乘的结果 也可以理解为输入有0 则输出为0 逻辑表达式 F
  • javascript原生项目:剑网三

    javascript原生项目 剑网三 技术 html css javascript 页面 欢迎页 游戏列表页 充值页 登录页 项目效果 ps 项目源码文件评论区见
  • 『数据结构』跳跃表

    本篇博客主要介绍一下跳跃表的原理和简单实现 什么是跳跃表 增加了向前指针的链表叫做跳表 跳表全称跳跃表 简称跳表 跳表是一个随机化的数据结构 实质就是一种可以进行二分查找的有序链表 跳表在原有的有序链表上面增加了多级索引 通过索引实现快速查
  • 七种经典排序算法小记

    首先要感谢MoreWindows的心得分享 通过他的文章 我更深入了解了这七种排序算法的思路 同时 也自己揣摩 手动敲代码实现了这些算法 为了加深理解 又给每一行代码加了注释 在此 特记下学习这七种排序算法的过程和心得 补充 冒泡排序 直接