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.mzph.cn/news/793038.shtml

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

相关文章

如何利用待办事项清单提高工作效率?

你是否经常因为繁重的工作量而感到不堪重负&#xff1f;你是否在努力赶工期或经常忘记重要的电子邮件&#xff1f;你并不是特例。如何利用待办事项清单提高工作效率&#xff1f;这里有一个简单的方法可以帮你理清混乱并更高效地完成任务—待办事项清单。 这种类型的清单可以帮…

有人用GPT来做日内交易,居然赚钱了!但是……

在我们还在烦恼会不会被AI替代时&#xff0c;已经有人在教ChatGPT去炒股票了。 在近年ChatGPT火速出圈后&#xff0c;围绕AI能取代什么职业的讨论持续受到大众关注。 从事客服、编程、法律合规以及内容创作等行业人员最早感受到这股AI带来的寒意。 那ChatGPT能不能替代交易员…

【原创】springboot+vue校园疫情防控管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

Spring Boot Mockito (三)

Spring Boot Mockito (三) 这篇文章主要是讲解Spring boot 与 Mockito 集成测试。 前期项目配置及依赖可以查看 Spring Boot Mockito (二) - DataJpaTest Spring Boot Mockito (一) - WebMvcTest Tag("Integration") SpringBootTest // TestMethodOrder(MethodOr…

【YOLOV5 入门】——构建自己的数据集模型训练模型检验

一、准备工作 1、数据收集 图片类型数据不用多说&#xff1b;视频类型数据利用opencv进行抽帧保存为一张张图片&#xff0c;这里选取30s的名侦探柯南片段进行试验&#xff0c;确保环境解释器下安装了opencv&#xff08;我使用的是另一个虚拟环境&#xff09;&#xff1a; im…

LeetCode每日一题之专题一:双指针 ——快乐数

快乐数OJ链接&#xff1a;202. 快乐数 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 题目分析: 为了房便叙述&#xff0c;将「对于⼀个正整数&#xff0c;每⼀次将该数替换为它每个位置上的数字的平方和」这⼀个 操作记为 x 操作&#xff1b; 题目告诉我们&#…

win10+Intel显卡安装配置stable-diffusion-webui绘画网页

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目…

基于springboot实现墙绘产品展示交易平台管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现墙绘产品展示交易平台管理系统演示 摘要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本墙绘产品展示交易平台就是在这样的大环境下诞生&…

企业微信企业主体变更认证介绍

企业微信变更主体有什么作用&#xff1f; 说一个自己亲身经历的事情&#xff0c;当时我在一家教育公司做运营&#xff0c;公司所有客户都是通过企业微信对接的。后来行业整顿&#xff0c;公司不得不注销&#xff0c;换了营业执照打算做技能培训&#xff0c;但发现注销后原来的企…

Gitee上传私有仓库

个人记录 Gitee创建账号 以KS进销存系统为例&#xff0c;下载到本地电脑解压。 新建私有仓库 仓库名称&#xff1a;ks-vue3&#xff0c;选择‘私有’ 本地配置 下载安装git配置git 第一次配置可以在本地目录右键【Open Git Bash here】输入【Git 全局设置】再输入【创…

点亮创意:ChatGPT如何搭桥DALL-E图像编辑新纪元

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

第十一届蓝桥杯物联网试题(省赛)

对于通信方面&#xff0c;还是终端A、B都保持接收状态&#xff0c;当要发送的数组不为空再发送数据&#xff0c;发送完后立即清除&#xff0c;接收数据的数组不为空则处理&#xff0c;处理完后立即清除&#xff0c;分工明确 继电器不亮一般可能是电压不够 将数据加空格再加\r…

4.4java学习总结

包装类 java给出了一组包装类可以将基本数据类型包装成对象&#xff0c;分别为Byte、Short、Integer、Long、Float、Double、Character、Boolean&#xff0c;对应不同的基本数据类型。 基本数据类型 包装类 int Integer char long Character Long float Float double …

【python实战】--提取所有目录下所有Excel文件指定列数据

系列文章目录 文章目录 系列文章目录前言一、问题描述二、python代码1.引入库 总结 前言 一、问题描述 需要提取指定路径下所有excel文件中指定一列数据&#xff0c;汇总到新文件&#xff0c;&#xff08;逐列汇总&#xff09; 二、python代码 1.引入库 代码如下&#xff08…

UE4_X光效果设置_法线图影响透明度

UE4_X光效果设置_法线图影响透明度 2019-03-22 13:37 Exponentin 设置轮廓光扩散度 baseReflectFactionIn 设置内部黑色的亮度值。nromal&#xff0c;连接应用一张法线图&#xff0c;Lerp两色插值&#xff0c;给两个数值&#xff0c;制造一个渐变。 法线图影响透明度&#xf…

在一套Dockerfile中完成编译和运行环境部署

大纲 解释型语言编译环境解释环境编译型语言编译环境运行环境 方法编译环境安装系统安装编译依赖下载代码特殊处理&#xff08;可以忽略&#xff09;编译准备&#xff08;可以忽略&#xff09;编译打包依赖&#xff08;编译结果&#xff09; 运行环境安装操作系统安装运行时依赖…

Leetcode 39. 组合总和

心路历程&#xff1a; 这道题就差把回溯算法写在题面上了&#xff0c;其实这道题如果不是要遍历所有的可能情况&#xff0c;而是求某个最大最小值的话&#xff0c;就是一道经典的完全背包问题了。 这道题有一个注意的点&#xff0c;就是如何通过‘控制候选集合’来实现‘不重复…

Android java基础_类的继承_android 类继承(2)

运行结果&#xff1a;rootubuntu:/home/topeet/guyilian# javac Ext2.java rootubuntu:/home/topeet/guyilian# java Ext2 10 ustc **子类继承父类的方法和属性都可以进行覆写&#xff0c;我们在子类覆写父类的printInfo方法。**class Person { private int age; public void …

AI技术在金融领域/银行业的应用和风险

前言 随着科技的不断发展&#xff0c;人工智能&#xff08;AI&#xff09;技术已经在各行各业得到了广泛的应用&#xff0c;其中包括银行业。银行业作为经济的重要组成部分&#xff0c;一直在不断地探索和应用新技术&#xff0c;以提升服务效率、风险管理和客户体验。然而&…

SpringBoot + Vue + Nginx前后端分离项目本地部署(Win)

SpringBoot Vue Nginx前后端分离项目本地部署步骤 本地部署所需步骤 将后端打包好的jar文件和前端生成的静态资源文件放入同一目录启动Spring Boot应用配置Nginx并重启访问 http://your_domain 查看部署效果 前端Vue项目部署 将写好的vue代码的目录下运行 npm run build …