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

转上一节: 

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));elseretun(Binary_Search(L,a.m-1,x)),}
}
考点3:贪心算法

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

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

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

题可得最优解】

考点4:动态规划法

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

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

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

考点5:回溯法

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Coursera上托福专项课程01:TOEFL Reading and Listening Sections Skills Mastery 学习笔记

TOEFL Reading and Listening Sections Skills Mastery Course Certificate 本文是学习 https://www.coursera.org/learn/toefl-reading-listening-sections-skills-mastery 这门课的笔记&#xff0c;如有侵权&#xff0c;请联系删除。 文章目录 TOEFL Reading and Listening …

ctypes 封装c语言

一&#xff0c;python与C类型对应关系 最左边一列的ctypes type&#xff0c;以替代C库中的各种类型。 二&#xff0c;不带参数的调用 1&#xff0c;target.c #include <stdio.h>void hello_world(){printf("hello downey!!\r\n"); } 2&#xff0c;执行命令…

数据库 06-02 并发控制

01 02. 互斥访问数据 分成两种&#xff1a; 事务控制器的作用

【系统架构师】-软件产品线与构件

1、产品线 核心资源、产品集合 1、过程驱动 2、特定领域 3、技术支持 4、以架构为中心 双生命周期模型&#xff1a; 建立产品线的方式&#xff1a;演化、革命 成功因素&#xff1a; 对该领域具备长期和深厚的经验 一个用于构建产品的好的核心资源库 好的产品线架构 好的管…

Spring Boot 整合 RabbitMQ 实现延迟消息

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

【Java基础】Java基础知识整合

文章目录 1. 转义字符2. 变量2.1 字符串与整型相加2.2 byte和short的区别2.3 float和double的区别2.4 char类型2.5 boolean类型2.6 自动类型转换及运算2.7 强制类型转换2.8 String的转换2.9 除法运算2.10 取模规则 3. 自增4. 逻辑运算符5. 赋值运算 6. 三元运算符&#xff1a;7…

05 | Swoole 源码分析之 WebSocket 模块

首发原文链接&#xff1a;Swoole 源码分析之 WebSocket 模块 大家好&#xff0c;我是码农先森。 引言 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它允许客户端和服务器之间进行实时数据传输。 与传统的 HTTP 请求-响应模型不同&#xff0c;WebSocket 可以保持…

每日五道java面试题之ZooKeeper篇(一)

目录&#xff1a; 第一题. ZooKeeper 是什么&#xff1f;第二题. Zookeeper 文件系统第三题. Zookeeper 怎么保证主从节点的状态同步&#xff1f;第四题. 四种类型的数据节点 Znode第五题 . Zookeeper Watcher 机制 – 数据变更通知 第一题. ZooKeeper 是什么&#xff1f; Zoo…

Python爬虫:http和https介绍及请求

HTTP和HTTPS 学习目标&#xff1a; 记忆 http、https的概念和区别记忆 浏览器发送http请求的过程记忆 http请求头的形式记忆 http响应头的形式了解 http响应状态码 1 为什么要复习http和https 在发送请求&#xff0c;获取响应的过程中 就是发送http或https的请求&#xff0c…

工业组态 物联网组态 组态编辑器 web组态 组态插件 编辑器

体验地址&#xff1a;by组态[web组态插件] BY组态是一款非常优秀的纯前端的【web组态插件工具】&#xff0c;可无缝嵌入到vue项目&#xff0c;react项目等&#xff0c;由于是原生js开发&#xff0c;对于前端的集成没有框架的限制。同时由于BY组态只是一个插件&#xff0c;不能独…

探索大数据时代下与云计算技术融合:实现企业级数据处理与分析的灵活性和效率性

引言&#xff1a; 关联阅读博客文章&#xff1a;深度剖析&#xff1a;计算机集群在大数据体系中的关键角色和技术要点 随着信息时代的到来&#xff0c;数据量的爆炸性增长已成为一种常态。企业、政府、科研机构等各个领域都面临着海量数据的收集、存储、处理和分析的挑战。在…

Linux云计算之Linux基础2——Linux发行版本的安装

目录 一、彻底删除VMware 二、VMware-17虚拟机安装 三、MobaXterm 安装 四、Centos 发行版 7.9的安装 五、rockys 9.1的安装 六、ubuntu2204的安装 一、彻底删除VMware 在卸载VMware虚拟机之前&#xff0c;要先把与VMware相关的服务和进程终止 1. 在windows中按下【Windo…

Spring Security——05,退出登录

退出登录 一、实现二、测试2.1、退出了是否还可以访问接口 一键三连有没有捏~~ 一、实现 我们只需要定义一个登陆接口&#xff0c;然后获取SecurityContextHolder中的认证信息&#xff0c;删除redis中对应的数据即可。 1、LoginController 添加一个方法 logout() 退出登录 2、…

51单片机实验01-点亮LED小灯

目录 一&#xff0c;软件下载 二&#xff0c;单片机概述 1&#xff0c;单片机内部资源 1&#xff09;flash 2&#xff09;ram 3&#xff09;sfr 2&#xff0c;51单片机 3&#xff0c;单片机最小系统 三&#xff0c;点亮最右边的小灯 1&#xff0c;指出满足小灯点亮的有…

基于Java微信小程序的医院挂号小程序,附源码

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

ajax教程

文章目录 一、原生ajax1、AJAX 简介2、特点1&#xff09;优点2&#xff09;缺点 二、http协议1、概念2、Cookie和Session机制1&#xff09;Cookie2&#xff09;Session3&#xff09;报文 二、请求头1、概念2、常见请求头&#xff1a;3、Content-Type 三、AJAX使用1、详细操作2、…

【RealSense】Ubuntu20.04 安装 Intel® RealSense™ ROS 并使用 D435i 测试

【RealSense】Ubuntu20.04 安装 Intel RealSense™ ROS 并使用 D435i 测试 1 本机环境2 安装流程3 存在的 bug3.1 Resource not found: rgbd_launch 1 本机环境 Ubuntu20.04ROS Noetic 2 安装流程 参考文档: Link 安装 Intel RealSense™ SDK 2.0&#xff0c;参考上一篇文章:…

【办公类-47-01】20240404 Word内部照片批量缩小长宽(课题资料系列)

作品展示 背景需求 最近在做《运用Python优化3-6岁幼儿学习操作材料的实践研究》的课题研究资料&#xff08;上半学期和下半学期&#xff09;。 将CSDN里面相关的研究照片文字贴入Word后&#xff0c;就发现一张图片就占了A4竖版一页&#xff0c;太大了。我想把word里面的所有…

入门用Hive构建数据仓库

在当今数据爆炸的时代&#xff0c;构建高效的数据仓库是企业实现数据驱动决策的关键。Apache Hive 是一个基于 Hadoop 的数据仓库工具&#xff0c;可以轻松地进行数据存储、查询和分析。本文将介绍什么是 Hive、为什么选择 Hive 构建数据仓库、如何搭建 Hive 环境以及如何在 Hi…

unity学习(82)——profiler 限制帧率

实际测试发现当玩家个数增加时&#xff0c;客户端明显变的很卡&#xff0c;想知道为什么变卡了&#xff01; 1.只有玩家自己的时候 2.两个时候感觉脚本的工作量增大了 拖了一会直接炸了&#xff01;&#xff08;数据包积压把内存搞炸&#xff0c;我第一次见&#xff09; 3.我觉…