<呕心沥血>一文总结数据结构八大排序(持续更新)

news2024/10/6 0:32:30

目录

一、常见的八大排序

二、八大排序的算法思想

1、冒泡排序

2、选择排序

3、插入排序

4、希尔排序

5、归并排序

6、快速排序

7、堆排序

8、计数排序

三、八大排序的算法实现


      一、常见的八大排序

常见的八大排序算法如下:

  1. 冒泡排序(Bubble Sort):比较相邻元素,如果第一个比第二个大,就交换它们两个的位置。

  2. 选择排序(Selection Sort):从未排序的部分找到最小值并放在已排序部分的末尾。

  3. 插入排序(Insertion Sort):将待排序序列分为已排序和未排序两部分,每次从未排序部分中取出第一个元素插入已排序部分的正确位置。

  4. 希尔排序(Shell Sort):是插入排序的改进版,通过对比较远距离的元素进行交换来提高效率。

  5. 归并排序(Merge Sort):采用分治思想,将待排序序列分成若干小段,先排序小段,再合并为整体有序序列。

  6. 快速排序(Quick Sort):选择一个基准元素,比基准元素小的放左边,比基准元素大的放右边,递归地对左右部分进行排序。

  7. 堆排序(Heap Sort):将待排序序列构建成一个大根堆或小根堆,每次取堆顶元素进行排序。

  8. 计数排序(Counting Sort):对于给定的一组输入元素,计算出每个元素出现的次数,再根据次数从小到大输出元素。

这八种排序算法各有优劣,应根据实际情况选择合适的算法。

二、八大排序的算法思想

1、冒泡排序

冒泡排序是一种最简单的排序算法,它的基本思想是通过相邻元素之间的交换来把小的元素往前移,大的元素往后移。经过多轮的排序操作,最终实现了整个数组的排序。

具体过程如下:

  1. 比较相邻的两个元素,如果第一个元素比第二个元素大,就把它们两个交换位置。

  2. 对相邻的元素对进行比较的过程称为一次遍历。一次遍历后,最后一个元素应该是当前未排序部分中的最大值。

  3. 对除已排序好的元素外的所有元素,不断进行遍历操作,直到所有元素都排序好。

时间复杂度为 O(n*2),是一个不稳定的排序算法。

2、选择排序

选择排序是一种简单直观的排序算法,其总体思路是找到数据结构中的最小值并将其放在第一位,接着找到第二小的元素并将其放在第二位,以此类推,直到所有元素都排序好。

具体过程如下:

  1. 遍历整个数组,找到最小的元素。

  2. 将最小元素放在数组的最前面,即第一个位置。

  3. 在剩下的未排序序列中,重复步骤一和步骤二。

时间复杂度为 O(n*2),是一个不稳定的排序算法。

3、插入排序

插入排序的基本思想是将待排序的元素插入到已排序的序列中。假设当前已经拍好的序列为 a1,a2,…,aia1​,a2​,…,ai​,待插入的元素为 ai+1ai+1​,则插入操作是将 ai+1ai+1​ 与 aiai​ 进行比较,如果 ai+1<aiai+1​<ai​,则将 aiai​ 后移,继续与前一个元素进行比较,直到找到合适的位置将 ai+1ai+1​ 插入。

具体过程如下:

  1. 将待排序的数组分成已排序和未排序两个部分。

  2. 从未排序部分中取出第一个元素,将其和已排序部分的元素依次比较并插入到正确的位置。

  3. 重复执行第二步,直到所有元素都被插入到已排序部分。

时间复杂度为 O(n*2),是一个稳定的排序算法。

4、希尔排序

希尔排序是插入排序算法的一种改进版,其基本思想是将待排序的数组划分为若干子序列,对每个子序列进行插入排序,通过逐步缩小子序列的间隔,最终完成整个数组的排序。

具体过程如下:

  1. 选择一个增量序列 t1,t2,…,tkt1​,t2​,…,tk​,其中 t1=n/2t1​=n/2,ti+1=ti/2ti+1​=ti​/2(向下取整)。

  2. 对于每个增量 titi​(i=k,k−1,…,1i=k,k−1,…,1),分别将待排序序列分割成若干长度为 titi​ 的子序列,分别进行直接插入排序。

  3. 最后对整个序列进行一次直接插入排序。

时间复杂度为 O(nlog_{2}n),是一个不稳定的排序算法。

5、归并排序

归并排序是一种效率比较高的排序算法,它的基本思路是采用分治法的思想,将待排序的序列分成若干个子序列,分别进行排序,在将已排序的子序列合并,最终得到完整的排序序列。

具体过程如下:

  1. 将待排序序列分成若干个子序列,在保证子序列内部有序的前提下,对所有子序列进行排序。

  2. 将排好序的子序列依次合并,直到得到完整的排序序列。

时间复杂度为 O(nlog_{2}n),是一个稳定的排序算法。

6、快速排序

快速排序是一种高效的排序算法,也是一种基于分治思想的排序算法。它的基本思路是选择一个基准元素,将待排序的序列分为两个部分:小于基准的元素和大于基准的元素。然后对这两个部分分别进行递归排序,最终得到完整的排序序列。

具体过程如下:

  1. 选择一个基准元素,通常选择第一个或最后一个元素。

  2. 将序列中比基准元素小的所有元素放在基准元素的左边,比基准元素大的所有元素放在基准元素的右边。

  3. 对基准元素左边和右边的序列分别递归执行上述过程。

时间复杂度为 O(nlog_{2}n)O(nlog2​n),是一个不稳定的排序算法。

7、堆排序

堆排序是一种树形选择排序算法,堆可以看成是一棵完全二叉树。堆排序的基本思想是将待排序的序列构建成一个大根堆或小根堆,每次取出堆顶元素进行排序。

具体过程如下:

  1. 构建堆:根据给定的序列构建大根堆或小根堆。

  2. 取出堆顶元素:每次从堆顶取出堆顶元素,放到已排序的序列中。

  3. 调整堆:将剩余的元素重新构建成一个堆。

  4. 重复执行步骤二和步骤三,直到所有元素都排序好。

时间复杂度为 O(nlog_{2}n),是一个不稳定的排序算法。

8、计数排序

计数排序是一种基于桶排序思想的排序算法,它通过计算给定序列中每个元素出现的次数,然后根据元素的出现次数进行排序,并将排序结果存储在新的数组中。

具体过程如下:

  1. 找出待排序数组中的最大值和最小值。

  2. 新建一个数组用于记录待排序数组中每个元素出现的次数。

  3. 统计每个元素在待排序数组中的出现次数。

  4. 对于每个元素,统计比它小的元素个数,确定它在新数组中的位置。

  5. 将待排序数组中的元素一个个放入新数组中对应的位置。

时间复杂度为 O(n+k),其中 k 是待排序数组中的最大值,是一个稳定的排序算法。

三、八大排序的算法实现

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

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

相关文章

Android中的接口回调机制

文章目录1.回调的含义和用途2.java实现接口回调3.Android中接口回调的体现4.接口回调在异步任务中的体现1.回调的含义和用途 一般来说&#xff0c;模块之间都存在一定的调用关系&#xff0c;从调用方式上看&#xff0c;可以分为三类同步调用、异步调用和回调。同步调用是一种阻…

JAVAWeb04-DOM

1. DOM 1.1 概述 1.1.1 官方文档 地址: https://www.w3school.com.cn/js/js_htmldom.asp 1.1.2 DOM 介绍 DOM 全称是 Document Object Model 文档对象模型就是把文档中的标签&#xff0c;属性&#xff0c;文本&#xff0c;转换成为对象来管理 1.2 HTML DOM&#xff08;文档…

为什么现代企业都在使用ERP系统 它有哪些优势

随着科技的不断发展&#xff0c;企业管理方式也在不断地发生改变。在这个信息化的时代&#xff0c;企业要想取得成功&#xff0c;必须要善于利用先进的信息化技术工具。其中&#xff0c;ERP系统是企业管理中不可或缺的重要工具。本文将探讨现代企业为什么会使用ERP系统&#xf…

CPU占用率高怎么办?正确解决方法在这里!

案例&#xff1a;CPU占用率高怎么解决 【各位朋友&#xff0c;我的电脑现在运行太慢了&#xff0c;同事说可能是CPU占用率太高了&#xff0c;但对本电脑小白来说&#xff0c;完全不知道怎么处理&#xff0c;大家有什么好的方法可以解决这个问题吗&#xff1f;】 在计算机中&a…

快看这些wireshark 命令,必须得会!

wireshark捕获命令 捕获器表达式语法&#xff1a; 限定词三类 Type&#xff1a;host、net、prot 指出其后数字或名字的意义&#xff08;主机&#xff0c;网段&#xff0c;端口&#xff09; Direction&#xff1a;src、dst 指出传输方向 &#xff08;源 、目的&#xff09; …

GcExcel Java Edition 6.0.6 Crack

概述 GrapeCity Documents for Excel&#xff0c;Java 版&#xff0c;是一个编程接口&#xff0c;允许 Java 开发人员以编程方式大规模创建和操作 Excel 文档。GrapeCity Documents for Excel 是一种解决方案&#xff0c;允许开发人员跨 Java 应用程序导入/导出、创建报告和模板…

论文阅读《GlueStick: Robust Image Matching by Sticking Points and Lines Together》

论文地址&#xff1a;https://arxiv.org/abs/2304.02008 源码地址&#xff1a;https://github.com/cvg/GlueStick 概述 针对视角变化时在闭塞、无纹理、重复纹理区域的线段匹配难的问题&#xff0c;本文提出一种新的匹配范式&#xff08;GlueStick&#xff09;&#xff0c;该方…

MySQL性能优化(三)事务与锁详解

文章目录什么是数据库事务&#xff1f;事务的四大特性&#xff1a;ACID事务的开启与结束案例表结构与数据案例事务并发的三大问题&#xff1a;脏读&#xff08;一个事务读取到了其他事务未提交的数据&#xff09;不可重复读&#xff08;一个事务读取到其他事务已提交的数据造成…

Qt在安卓手机输出‘hello,world‘

我也想实现这样的功能。 最开始的参考文章&#xff1a; (2条消息) Qt android 开发环境搭建_逝水流年丶轻染尘的博客-CSDN博客 方案1&#xff1a;(失败) 我之前已经下载过 Qt5.14.2了&#xff0c;所以我想直接添加组件 中间过程参考&#xff1a; (2条消息) Qt更新组件出现&…

敏捷开发模式下如何用 PingCode 这类工具迭代管理

迭代&#xff08;Sprint&#xff09;是 Scrum 敏捷开发框架的核心&#xff0c;正确的迭代可以帮助敏捷团队提高工作交付速度。Scrum 团队以完成迭代待办列表为工作目标&#xff0c;并在迭代结束时交付一定的产品增量。PingCode 以产品待办列表作为迭代管理的核心&#xff0c;因…

java并发编程之美第二章读书笔记

并发编程的其他基础知识 什么是多线程的并发编程 并发: 同一时间段内多个任务同时都在执行,且执行都没有执行结束,强调的是在一个时间段内同时执行,而一个时间段由多个时间积累而成的,所以并发的多个任务在单位时间内并不一定同时执行 并行: 单位时间内多个任务同时在执行…

基于GPT-4免费生成代码的工具!小游戏,管理系统都能生成!

Cursor支持Python、Java、C、JavaScript、C#等等&#xff0c;可AI生成代码&#xff0c;功能非常强大&#xff01;这篇教程将教你如何下载安装&#xff0c;带你玩转Cursor 目录 话不多说&#xff0c;先看能力&#xff1a; 只需要三步&#xff0c;就可以AI出你想要的代码&#x…

测试基础知识

开发模型和测试模型 软件的生命周期 软件的生命周期指的是产品从设想开始到软件不再使用的时间。 软件的生命周期可以分为6个阶段&#xff1a;需求分析&#xff0c;计划&#xff0c;设计&#xff0c;编码&#xff0c;测试&#xff0c;运行维护。 瀑布模型 适用项目&#xf…

[考研数据结构]第3章之栈的基本知识与操作

文章目录 栈的基本概念 栈的实现 顺序栈 共享栈 链栈 栈的基本概念 栈的定义 栈&#xff08;Stack&#xff09;是只允许在一端进行插入或删除操作的线性表 相关术语 栈顶&#xff08;Top&#xff09;线性表允许进行插入或删除的那一端称之为栈顶栈底&#xff08;Bottom&…

JAVASE基础(二)

这里写目录标题JAVASE基础11.科学计数法12.编码和字符集12.编译格式问题13.类型转换类型级别自动类型转换强制类型转换特殊情况14.final修饰符a.修饰变量b.修饰方法c.修饰类15.scanner使用16.两个数交换引入中间变量位运算数学数方法一数学计数方法二17.扩展赋值运算符&#xf…

递归算法_字符串反转_20230412

递归算法-字符串反转 前言 递归算法对解决重复的子问题非常有效&#xff0c;字符串反转也可以用递归算法加以解决&#xff0c;递归算法设计的关键是建立子问题和原问题之间的相关性&#xff0c;同时需要确立递归退出的条件&#xff1b;如果递归退出的条件无法确定&#xff0c…

【LeetCode: 面试题 17.13. 恢复空格 | 暴力递归=>记忆化搜索=>动态规划】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

Redis安装和配置

目录本章重点Redis安装Redis启动和停止配置后台启动连接前的配置本章重点 主要掌握安装和启动了解redis的配置文件进行配置掌握Redis几种启动方式 Redis安装 下载 Redis官网 点击下载 解压 然后将下载好的压缩包上传到服务器,进行解压! tar zxvf 进行解压 编译 我们要进行编…

4.12每日一练

题目&#xff1a;给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外&#xff0c;这两个数…

学生信息管理系统【GUI/Swing+MySQL】(Java课设)

系统类型 Swing窗口类型Mysql数据库存储数据 使用范围 适合作为Java课设&#xff01;&#xff01;&#xff01; 部署环境 jdk1.8Mysql8.0Idea或eclipsejdbc 运行效果 本系统源码地址&#xff1a;https://download.csdn.net/download/qq_50954361/87673902 更多系统资源库…