6:算法基础--6.3:排序算法,6.4:算法策略

news2025/1/16 20:49:09

转上一节: 

http://t.csdnimg.cn/fr4I4icon-default.png?t=N7T8http://t.csdnimg.cn/fr4I4

6.3:排序算法

考点1:排序算法的基本概念

1.排序的概念

  • 稳定与不稳定排序

2.排序方法分类

  • 插入类排序
  • 直接插入排序
  • 希尔排序
  • 交换类排序
  • 冒泡排序
  • 快速排序
  • 选择类排序
  • 简单选择排序
  • 堆排序
  • 归并排序
  • 基数排序

考点2:插入类排序

1:直接插入排序

直接插入排序:即当插入第i个记录时,R1,R2,.....,R_{i+1}均已排好序,因此,将第i个记录R_{i}依次与

R_{i},....,R_{2},R_{1}进行比较,找到合适的位置插入。它简单明了,但速度很慢。

直接插入排序是一种稳定的排序方法, 时间复杂度为O(n^{2})。在排序过程中仅需要一个元素的辅助

空间, 空间复杂度为0(1)

适用于基本有序的情况,此时时间复杂度近乎线性,即O(n)。

2:希尔(Shell) 排序

希尔(Shell) 排序:先取一个小于n的整数d1作为第一个增量, 把文件的全部记录分成d_{1}个组。所

有距离为d_{1}的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量

d2<d1重复 上述的分组和排序,直至所取的增量d_{t}=1(dt<d_{t-1}<......<d_{2}<d_{1}),即所有

记录放在同一组中进行直接插入排序为止。该访法实质上是一种分组插入方法。

希尔排序是一种不稳定的排序方法,据统计分析其时间复杂度约为O(n^{1.3})。在排序过程中仅需要

一个元素的辅助空间用于数组元素的交互,空间复杂度为O(1)。

 

考点3:选择类排序

1:直接选择排序

直接选择排序的过程是,首先在所有记录中选出排序码最小的记录,把它与第1个记录交换,然后

在其余的记录内选出排序码最小的记录,与第2个记录交换……依此类推,直到所有记录排完为止。

直接选择排序是一种不稳定的排序方法,其时间复杂度约为O(n^{2})。在排序过程中仅需要一个元素

的辅助空间用于数组元素的交互,空间复杂度为O(1)。 

2:堆的概念

设有n个元素的序列{K_{1},K_{2},......,K_{n}}, 当且仅当满足下述关系之一时,称之为堆。

(1) K_{i}\leq K_{2i}K_{i}\leq K_{2i+1};父结点小于等于左右两个子结点。第一个元素最小。

(2) K_{i}\geq K_{2i}K_{i}\geq K_{2i+1};父结点大于等于左右两个子结点。第一个元素最大。

其中(1)称为小顶堆,(2) 称为大顶堆。 

3.堆排序

堆排序的基本思想为:先将序列建立堆,然后输出堆顶元素,再将剩下的序列建立堆,然后再输出

堆顶元素,依此类推,直到所有元素均输出为止,此时元素输出的序列就是一个有 序序列。

对于大量的记录来说,堆排序是很有效的。

堆排序的算法步骤如下(以大顶堆为例) :

(1)初始时将顺序表R[1...n]中元素建立为一个大顶堆,堆顶位于R[1],待序区为R[1...n]。

(2) 循环执行步骤3~步骤4,共n-1次。

(3)假设为第i次运行,则待序区为R[1...n-i+1], 将堆顶元素R[1]与待序区元素R[n-i+1]交换,此时顶

点元素被输出,新的待序区为R[1..n-1]。

(4)待序区对应的堆已经被破坏,将之重新调整为大顶堆。

将顺序表R{30, 60,10, 50, 45,16, 15, 80, 40, 20}进行堆排序。 

[初建堆]

[取走堆顶元素60,重建堆]

堆排序的时间复杂度为::O(nlog2n), 为什么? 

堆排序的空间复杂度为:O(1)。 

考点4:交换类排序

1.冒泡排序

冒泡排序的基本思想是,通过相邻元素之间的比较和交换,将排序码较小的元素逐渐从底部移向顶

部。整个排序的过程元素就像水底下的气泡一样逐渐向上冒,因此称为冒泡算法。

冒泡排序是一种稳定的排序方法,其时间复杂度约为O(n^{2})。在排序过程中仅需要一个元素的辅助

空间用于数组元素的交互,空间复杂度为O(1)。

2:快速排序

快速排序采用的是分治法,其基本思想是将原问题分解成若干个规模更小但结构与原问题相似的子

问题,通过递归地解决这些子问题,然后再将这些子问题的解组合成原问题的解。

在O(nlog_{2}n)时间量级上,平均性能最好。

快速排序通常包括两个步骤:

第一步,在待排序的n个记录中任取一个记录, 以该记录的排序码为准,将所有记录都分成两组,

第1组都小于该数,第2组都大于该数,如图所示。 

第二步,采用相同的方法对左、右两组分别进行排序,直到所有记录都排到相应的位置为止。 

 

快速排序的基准元素:一般是第一个元素, 也可以设置中位数。

快速排序是种不稳定的排序方法,平均和最优情况下时间复杂度约为0(nlog_{2}n)。

快速排序的最差情况--------基 本有序

以第一个元素为基准元素,此时时间复杂度为O(n^{2})。

以中位数为基准元素,此时时间复杂度为O(nlog_{2}n)。

辅助空间

(1)空间复杂度默认为O(1)。

(2)需要辅助空间存储左侧数组和右侧数组时,空间复杂度为O(n)。

(3)需要记录所有基准元时,空间复杂度为O(nlog_{2}n)。 

考点5:归并排序

归并也称为合并,是将两个或两个以上的有序子表合并成一个新的有序表。 若将两个有序表台并

成一个有序表,则称为二路合并。合并的过程是:比较A[i]和A[j]的排序码大小,若A[i]的排序码小

于等于A[j]的排序码,则将第一个有序表中的元素A[i]复制到R[k]中,i和k分别加1;如此循环下去,

直到其中一个有序表比较和复制完,然后再将另一个有序表的剩余元素复制到R中。

归并排序是一种稳定的排序方法, 其时间复杂度约为O(nlog_{2}n)。在排序过程中仅需要一个元素

的辅助空间用于数组元素的交互,空间复杂度为O(n)。

考点6:基数排序

基数排序是一种借助多关键字的排序思想对单逻辑关键字进行排序的方法。基数排序不是基于关健

字比较的排序方法,它适合于元素很多而关键字较少的序列。基数的选择和关键字的分解是根据关

键字的类型来决定的,例如关键字是十进制数,则按个位、十位来分解。

基数排序是一种稳定的排序方法,其时间复杂度约为O(d(n+rd))。在排序过程中仅需要一个元素的

辅助空间用于数组元素的交互,空间复杂度为O(rd)。 

考点7:排序算法对比 

在选取排序方法时需要考虑的因素有待排序的记录个数n、记录本身的大小、关键字的分布情况、

对排序稳定性的要求、语言工具的条件和辅助空间的大小。依据这些因素,可以得到以下几点结

论:

  • 若待排序列的记录数目n较小,可采用直接插入排序和简单选择排序。由于直接插入排序所需的记录移动操作较简单选择排序多,因而当记录本身信息量大时,用简单选择排序方法较好。
  • 若待排记录按关键字基本有序,宜采用直接插入排序或冒泡排序。
  • 当n很大且关键字位数较少时,采用基数排序较好。
  • 若n很大,则应采用时间复杂度为O(nlog_{2}n)的排序方法,例如快速排序、堆排序或归并排序;

(1)快速排序目前被认为是内部排序中最好的方法,当待排序的关键字为随机分布时,快速排序的平

均运行时间最短。

(2)堆排序只需要一个辅助空间, 并且不会出现在快速排序中可能出现的最快情况。

(3)快速排序和堆排序都是不稳定的排序方法,若要求排序稳定,可选择归并排序。

6.4:算法策略

考点1:算法策略概述

1:分治法

特征:把一个问题拆分成多个小规模的相同子问题,一般可用递归解决。

经典问题:斐波那契数列、归并排序、快速排序、矩阵乘法、二 分搜索、大整数乘法、汉诺塔。

2:贪心法(一 般用于求满意解)

特征:局部最优,但整体不见得最优。每步有明确的、既定的策略。

经典问题:背包问题(如装箱)、多机调度、 找零钱问题、最小生成树问题(普里姆算法、克鲁斯卡

尔算法)。

3.动态规划法(用于求最优解)-------. 最优子结构”和递归式

特征:划分子问题,使用数组存储子问题结果,利用查询子问题结果构造最终问题结果。(一 般自

顶向下时间复杂度为O(2^{n}),自底向上时间复杂度为O(n^{a})效率更高)

经典问题:斐波那契数列、矩阵乘法、背包问题、LCS最长公共子序列。

4:回溯法

特征:系统的搜索一个问题的所有 解或任一解。

经典问题: N皇后问题、迷言、背包问题。

(回溯法对解空间做深度优先探索,分支限界法对解空间做广度优先探索)

考点2:分治法

对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决;否则将其分

解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然

后将各子问题的解合并得到原问题的解。

该问题的规模缩小到一定的程度就可以容易地解决

该问题可以分解为若干个规模较小的相同问题

利用该问题分解出的子问题的解可以合并为该问题的解

该问题所分解出的各个子问题是相互独立的

分解

解决

合并

1:分治法(递归技术)

递归,就是在运行的过程中调用自己。

2:分治法(二分查找)

function Binary_Search(L,a,b,x){
    if(a>b) return(-1);
        else{
            m=(a+b)/2;
        if([x==L[m])return(m);
        else if(x>L[m])
            retun(Binary_Search(L,m+1,b,x));
        else
            retun(Binary_Search(L,a.m-1,x)),
            }
}
考点3:贪心算法

总是做出在当前来说是最好的选择,而并不从整体上加以考虑,它所做的每步选择只是当前步骤的

局部最优选择,但从整体来说不一定是最优的选择。由于不必为了寻找最优解而穷尽所有可能解,

因此其耗费时间少,一般可以快速得到满意的解,但可能得不到最优解。【贪心法解决部分背包问

题可得最优解】

考点4:动态规划法

在求解问题中,对于每步决策, 列出各种可能的局部解,再依据某种判定条件,舍弃那些肯定不能

得到最优解的局部解,每一步都经过筛选,以每一步都是最优解来保证全局是最优解。 (问题中如

果出现“最优子结构”这类描述,并且结果用递归式表示,一般为动态规划法)

考点5:回溯法

回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当搜索到某一步时,发现原先选

择并不优或达不到目标,就退回一步重新选择。这种走不通就退回再走的技术就是回溯法。 

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

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

相关文章

spring事务那些事

实际工作中迓会面临千奇百怪癿问题&#xff0c;看下面返个例子&#xff08;注意MySql数据库测试&#xff09;&#xff1a; //1.hello1Service 调用 hello2Service Transactional(propagation Propagation.REQUIRED,rollbackFor Exception.class) public void doUpdate() {//…

B/S架构SaaS模式 医院云HIS系统源码,自主研发,支持电子病历4级

B/S架构SaaS模式 医院云HIS系统源码&#xff0c;自主研发&#xff0c;支持电子病历4级 系统概述&#xff1a; 一款满足基层医院各类业务需要的云HIS系统。该系统能帮助基层医院完成日常各类业务&#xff0c;提供病患挂号支持、病患问诊、电子病历、开药发药、会员管理、统计查…

Centos-Linux安装部署MySQL-8.0

linux搭建mysql 1.使用系统的root账户 2.切换到 /usr/local 目录下 3.下载mysql wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.31-linux-glibc2.12-x86_64.tar.xz也可以直接在官方下载最新版本 官方下载 选择linux 4.解压mysql tar xvJf mysql-8.0.21-l…

一文介绍回归和分类的本质区别 !!

文章目录 前言 1、回归和分类的本质 &#xff08;1&#xff09;回归&#xff08;Regression&#xff09;的本质 &#xff08;2&#xff09;分类&#xff08;Classification&#xff09;的本质 2、回归和分类的原理 &#xff08;1&#xff09;回归&#xff08;Regression&#x…

Github 2024-04-04 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-04-04统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目5TypeScript项目2Go项目1Jupyter Notebook项目1Java项目1C++项目1非开发语言项目1Vue项目1编程面试大学:成为软件工程师的全面学习计…

【前端面试3+1】11 http和https有何不同及https的加密过程、数组有哪些方法及作用、tcp三次握手四次挥手、【分发饼干】

一、http和https有何不同&#xff1f;https的加密过程 1、不同&#xff1a; HTTP和HTTPS的主要区别在于安全性。HTTP是超文本传输协议&#xff0c;是一种用于传输数据的协议&#xff0c;但是传输的数据是明文的&#xff0c;容易被窃听和篡改。而HTTPS是在HTTP基础上加入了SSL/T…

QT----opencv4.8.0编译cuda版本,QTcreater使用

目录 1 编译opencv4.8.02 验证能否加载GPU cuda12.1 opencv4.8.0 vs2019 cmake3.29 1 编译opencv4.8.0 打开cmake&#xff0c;选择opencv480路径&#xff0c;build路径随意 点击configure后&#xff0c;选择这些选项&#xff0c;opencv_word&#xff0c;cuda全选&#xff0c;…

前端三剑客 —— CSS (第五节)

目录 内容回顾&#xff1a; 特殊样式 特殊样式 CSS变量 常见函数 倒影效果 页面布局 Table 布局&#xff08;了解即可&#xff09; DIVCSS布局 弹性布局 1&#xff09;不使用弹性布局&#xff0c;而是使用DIVCSS 2&#xff09;使用弹性布局实现导航菜单 内容回顾…

Paddle实现人脸对比

人脸对比 人脸对比&#xff0c;顾名思义&#xff0c;就是对比两个人脸的相似度。本文将用Paddle实现这一功能。 PS&#xff1a;作者肝了整整3天才稍微搞明白实现方法 数据集准备 这里使用百度AI Studio的开源数据集&#xff1a; 人脸数据_数据集-飞桨AI Studio星河社区 (b…

基于SSM的教材管理系统的设计与实现(论文+源码)_kaic

基于SSM的教材管理系统的设计与实现 摘 要 当下&#xff0c;正处于信息化的时代&#xff0c;许多行业顺应时代的变化&#xff0c;结合使用计算机技术向数字化、信息化建设迈进。以前学校对于教材信息的管理和控制&#xff0c;采用人工登记的方式保存相关数据&#xff0c;这种以…

Spring Boot 整合 RabbitMQ 实现延迟消息

关于 RabbitMQ 消息队列&#xff08;Message Queuing&#xff0c;简写为 MQ&#xff09;最初是为了解决金融行业的特定业务需求而产生的。慢慢的&#xff0c;MQ 被应用到了更多的领域&#xff0c;然而商业 MQ 高昂的价格让很多初创公司望而却步&#xff0c;于是 AMQP&#xff0…

人工智能改变教育:理解和在课堂上使用 ChatGPT 的指南

原文&#xff1a;Talking to Machines: The Fascinating Story of ChatGPT and AI Language Models 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 这本直言不讳、幽默风趣的指南充满了可操作的提示、技巧和策略&#xff0c;帮助你在业务中充分利用 ChatGPT 的优势。在…

【氮化镓】GaN SP-HEMT的栅极可靠性

概括总结&#xff1a; 本文研究了氮化镓&#xff08;GaN&#xff09;肖特基型p-栅高电子迁移率晶体管&#xff08;GaN SP-HEMT&#xff09;的栅极鲁棒性和可靠性&#xff0c;通过一种新的电路方法评估了在实际转换器中栅极电压&#xff08;VGS&#xff09;过冲波形的栅极电压应…

网络基础二——TCP可靠性实现机制补充

11.3.4确认应答机制 ​ 1.双方通信时要返回确认应答报文&#xff0c;保证对方发送的报文是有效的&#xff1b;尽管整个通信过程中无法保证数据全部可靠&#xff0c;但是可以保证单个方向发送的数据是可靠的&#xff1b; ​ 发送的报文要设置序号&#xff0c;如果是应答报文要…

一、持续集成介绍

持续集成介绍 一、什么是持续集成二、持续集成的流程三、持续集成的组成要素四、持续集成的好处 一、什么是持续集成 持续集成&#xff08;CI&#xff09;指的是&#xff0c;频繁地&#xff08;一天多次&#xff09;将代码集成到主干。持续集成的目的&#xff0c;就是让产品可…

《Java面试自救指南》(专题二)计算机网络

文章目录 力推的计网神课get请求和post请求的区别在浏览器网址输入一个url后直到浏览器显示页面的过程常用状态码session 和 cookie的区别TCP的三次握手和四次挥手七层OSI模型&#xff08;TCP/IP协议模型&#xff09;各种io模型的知识http协议和tcp协议的区别https和http的区别…

理解pytorch的广播语义

目录 什么是广播运算 广播的条件 示例 示例1 示例2 示例3 补1 示例4 原位运算 示例5 参与广播运算的两个tensor&#xff0c;必须是从右向左对齐 总结规律 两个tensor可以做广播运算的条件&#xff1a; 两个可以互相广播的tensor运算的步骤&#xff1a; 例子&#x…

Java | Leetcode Java题解之第8题字符串转换整数atoi

题目&#xff1a; 题解&#xff1a; class Solution {public int myAtoi(String str) {Automaton automaton new Automaton();int length str.length();for (int i 0; i < length; i) {automaton.get(str.charAt(i));}return (int) (automaton.sign * automaton.ans);} …

Scala第二十章节(Akka并发编程框架、Akka入门案例、Akka定时任务代码实现、两个进程间通信的案例以及简易版spark通信框架案例)

Scala第二十章节 章节目标 理解Akka并发编程框架简介掌握Akka入门案例掌握Akka定时任务代码实现掌握两个进程间通信的案例掌握简易版spark通信框架案例 1. Akka并发编程框架简介 1.1 Akka概述 Akka是一个用于构建高并发、分布式和可扩展的基于事件驱动的应用工具包。Akka是…

MySQL 导入库/建表时/出现乱码

问题描述&#xff1a; 新建不久的项目在使用Navicat for MySQL进行查看数据&#xff0c;发现表中注释的部分乱码&#xff0c;但是项目中获取的数据使用不会。 猜测因为是数据库编码和项目中使用的不一样&#xff0c;又因为项目的连接语句定义了需要编码&#xff0c;故项目运行…