【数据结构】排序算法(上)—— 排序算法概述

news/2024/11/23 3:21:09/

目录

🍍前言🍍:

🍉一、排序算法概述🍉:

1.排序的概念:

2.常见排序应用:

🥝二、常见排序算法🥝:

1.插入排序:

直接插入排序算法:

希尔排序算法:

2.选择排序:

直接选择排序算法:

堆排序算法:

3.交换排序:

冒泡排序算法:

快速排序算法:

4.归并排序:

归并排序算法:

5.非比较排序:

计数排序算法:

🍒总结🍒:


🛰️博客主页:✈️銮同学的干货分享基地

🛰️欢迎关注:👍点赞🙌收藏✍️留言

🛰️系列专栏:🎈 数据结构

                       🎈【进阶】C语言学习

                       🎈  C语言学习

🛰️代码仓库:🎉数据结构仓库

                       🎉VS2022_C语言仓库

        家人们更新不易,你们的👍点赞👍和⭐关注⭐真的对我真重要,各位路过的友友麻烦多多点赞关注,欢迎你们的私信提问,感谢你们的转发!

        关注我,关注我,关注我,你们将会看到更多的优质内容!!


🏡🏡 本文重点 🏡🏡:

🚅 排序算法概述 🚃 常见排序算法 🚏🚏

🍍前言🍍:

        从今天开始,我们就将开始学习数据结构的最后一部分关于排序算法的相关知识。并且在今天我们要学习的这些排序算法中,其中一部分的排序方式是我们在前面的学习中就了解过的,例如直接选择排序、冒泡排序等等。当然还有一部分我们还没有了解过的排序算法,例如希尔排序与归并排序等等。这些排序算法原本归属不同的知识部分,而现在我们将它们放在一起进行对比学习。

        今天的内容相对简单,仅对排序算法的基础性知识作以了解。其他内容的知识将在后续的学习中为大家逐一讲解。

🍉一、排序算法概述🍉:

        在正式开始学习排序算法之前,我们首先来了解一下排序算法的相关基础知识。

1.排序的概念:

  • 排序:排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列。
  • 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,则称之为稳定。例如 A1=A2,且 A1 在 A2 之前,而在排序后的序列中,A1 仍在 A2 之前,则称这种排序算法是稳定的;否则称为不稳定的。
  • 内部排序:内部排序也称为内排序,是指待排的记录全部在内存中完成排序的过程,是被排序的数据元素全部存放在计算机内存中的排序算法
  • 外部排序:外部排序指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存,需要在内存和外部存储器之间进行多次数据交换,以达到排序整个文件的目的。根据排序过程的要求,是不能在内外存之间移动数据的排序。

2.常见排序应用:

        关于各种排序算法的应用就十分常见了,例如我们常常使用的各种购物网站售品的各种筛选排序

        再比如我们常见的各省高校排名

        甚至是我们游戏中的各项战力榜单

        不难发现,在我们的日常生活中排序算的使用随处可见,充斥着我们的各项生产活动,我们的考试排名、绩效考核、综测排名,甚至是各种富豪榜的排名都广泛的使用到了许多种不尽相同的排序算法。

        于是我们就在接下来的几节课中,把这些常见的排序算法全部放在一起,对比学习,以便于我们更好的理解这些算法的使用方式、使用条件与适用场景等等,帮助我们在合适的场景中,选取使用最恰当的排序算法,最大程度上提高我们的工作和学习效率

🥝二、常见排序算法🥝:

        今天我们首先了解一下常见的排序算法,不做深究,仅了解它们大致的作用原理,具体实现将在下节课中注意为各位小伙伴们进行完整细致的讲解。

        最常用的排序算法可以分为四大类:插入排序、选择排序、交换排序与归并排序。插入排序的代表算法有直接插入排序与希尔排序;选择排序的排序算法代表是选择排序与堆排序;交换排序中我们要熟识冒泡排序与快速排序;归并排序则主要是以归并排序算法为主,及一些由归并思想衍生出的排序算法:

1.插入排序:

直接插入排序算法:

  • 直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。

直接插入排序算法特性:

  1. 元素集合越接近有序,直接插入排序算法的时间效率越高
  2. 时间复杂度:O(N^2)
  3. 空间复杂度:O(1) ,它是一种稳定的排序算法。
  4. 稳定性:稳定

希尔排序算法:

  • 希尔排序法又称缩小增量法希尔排序法的基本思想是:先选定一个整数,把所有待排序记录记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,即所有记录在统一组内排好序。

希尔排序算法特性:

  1. 希尔排序是对直接插入排序的优化
  2. 增量 > 1时都是预排序,目的是让数组更接近于有序。当增量为 1 时,数组已经接近有序了,再进行排序就能提高算法执行的时间效率
  3. 希尔排序的时间复杂度不好计算,因为增量的取值方法很多,这就导致我们在处理实际问题时很难去进行具体的计算。同时也正因如此,一些树中给出的希尔排序算法在执行时的时间复杂度都不固定
  4. 希尔排序算法的性能与所选取的分组长度序列有很大关系。且当针对特定的待排序记录序列时,可以准确地估算关键词的比较次数和对象移动次数。但想要弄清关键词比较次数和记录移动次数与增量选择之间的关系,并给出完整的数学分析,至今仍然是数学难题
  5. 领域专家 Knuth 通过大量的实验,给出了较好的结果:当n较大时,比较和移动的次数约在 n^1.25 到 (1.6n)^1.25 之间
  6. 稳定性:不稳定

2.选择排序:

直接选择排序算法:

  • 直接选择排序算法基本思想:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,并不断重复这一动作,直到全部待排序的数据元素全部排序完成。

选择排序算法特性:

  1. 直接选择排序逻辑好理解,但效率不是很好,实际中很少使用
  2. 时间复杂度:O(N^2)
  3. 空间复杂度:O(1)
  4. 稳定性:不稳定

堆排序算法:

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

堆排序算法特性:

  1. 使用堆来选择数据,效率高了很多
  2. 时间复杂度:O(N*logN)
  3. 空间复杂度:O(1)
  4. 稳定性:不稳定

3.交换排序:

冒泡排序算法:

  • 冒泡排序算法基本思想:根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动

冒泡排序算法特性:

  1. 冒泡排序是一种非常容易理解的排序。
  2. 时间复杂度:O(N^2)
  3. 空间复杂度:O(1)
  4. 稳定性:稳定

快速排序算法:

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

Hoare 版本:

挖坑法:

前后指针版本:

快速排序算法特性:

  1. 快速排序整体的综合性能和使用场景都是比较好的,故称快速排序
  2. 时间复杂度:O(N*logN) 。快速排序的过程类似于高度为 logN 的二叉树,且每层约有 N 个数,如图:
  3. 空间复杂度:O(logN)
  4. 稳定性:不稳定

4.归并排序:

归并排序算法:

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

归并排序算法特性:

  1. 归并的缺点在于需要 O(N) 的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题
  2. 时间复杂度:O(N*logN)
  3. 空间复杂度:O(N)
  4. 稳定性:稳定

5.非比较排序:

计数排序算法:

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

计数排序算法特性:

  1. 计数排序在数据范围集中时,效率很高,但是适用范围及场景有限
  2. 时间复杂度:O(MAX(N,范围))
  3. 空间复杂度:O(范围)
  4. 稳定性:稳定

🍒总结🍒:

        以上我们涉及到了八种不同的排序算法,它们的执行原理各不相同,执行时的时间与空间效率也存在着或多或少的差异。但是各位小伙伴们一定要知道,排序算法之间实质上并无好坏之分,我们应该结合我们实际的使用场景与使用条件,选择最合适的排序算法。我们的最终目的,永远都是通过使用更恰当的算法,来帮助我们更高效的处理和解决我们遇到的实际应用问题。今天的学习就到此为止了,在下节课中我将为各位小伙伴们深入地讲解每一种算法功能接口的具体实现

        🔥🔥奋斗者在汗水汇集的江河里,将事业之舟驶到了理想的彼岸🔥🔥

        更新不易,辛苦各位小伙伴们动动小手,👍三连走一走💕💕 ~ ~ ~  你们真的对我很重要!最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!


http://www.ppmy.cn/news/22358.html

相关文章

面经九2023.2.3上午笔试和群面

面经九2023.2.3.上笔试和群面 1、 根据指定的数据模型,完成对应SQl语句的编写 edu_class表 Student表: 要求1:使用左连接查询出year为2022的学生,且只查询出10条数据。 插入数据, INSERT INTO ed_class VALUES(1,2,李鹏,帅,…

LeetCode——1798. 你能构造出连续值的最大数目

一、题目 给你一个长度为 n 的整数数组 coins ,它代表你拥有的 n 个硬币。第 i 个硬币的值为 coins[i] 。如果你从这些硬币中选出一部分硬币,它们的和为 x ,那么称,你可以 构造 出 x 。 请返回从 0 开始(包括 0 &…

c++之继承[把控细节]

前言 我们知道C语言是一门面向对象编程的语言,而面向对象编程有三大特性,它们分别是:封装,继承,多态。本文将介绍面向对象编程的另一大特性:继承。学习继承之前,由题目可知细节是非常多的。继承…

docker网络模式

目录 一、docker网络概述 1、docker网络实现的原理 1.1 随机映射端口( 从32768开始) 1.2 指定映射端口 1.3 浏览器访问测试 二、 docker的网络模式 1、默认网络 2、使用docker run 创建Docker容器时,可以用--net或--network 选项指定容器的网络模式 三、do…

【linux】进程间通信——管道通信

进程间通信一、进程间通信1.1 通信的介绍1.2 通信的目的1.3 通信的分类二、管道2.1 匿名管道2.1.1 pipe2.2.2 读写特征2.2.3 命名管道一、进程间通信 1.1 通信的介绍 通信就是一个进程把数据传递给另一个进程,但是每个进程都具有独立性。通信的本质:OS需…

PTA L1-034 点赞(详解)

前言:本期是关于点赞的详解,内容包括四大模块:题目,代码实现,大致思路,代码解读,今天你c了吗? 题目: 微博上有个“点赞”功能,你可以为你喜欢的博文点个赞表示支持。每篇…

数据结构和算法概述

目录 一:什么是数据结构? 官方解释: 大白话: 二:数据结构分类 逻辑结构分类: a.集合结构:集合结构中数据元素除了属于同一个集合外,他们之间没有任何其他的关系。 b.线性结构&am…

细讲TCP三次握手四次挥手(二)

TCP/IP 协议族 应用层 应用层( application-layer )的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程(进程:主机中正在运行的程序)间的通信和交互的规则。 对于不同的网络应用需要不同的应用层协议…