数据结构:排序的基本概念

news2024/9/24 7:23:04

排序(sorting)是按关键字的非递减或非递增顺序对一组记录重新进行整队(或排列)的操作。确切描述如下:

假设含有 n 个记录的序列为
{r1 ,r2 , … ,rn} (3-1)

它们的关键字相应为
{k1 ,k2 , … ,kn}

对式(3-1)的记录序列进行排序就是要确定序号 1,2,···,n 的一种排列
p1,p2 , … ,pn

使其相应的关键字满足如下的非递减(或非递增)的关系:
kp1<=kp2<=… <=kpn (3-2)

也就是使式(3-1)的记录序列重新排列成一个按关键字有序的序列
{rp1<=rp2<=…<=rpn} (3-3)

当待排序记录中的关键字 ki(i=1,2,…,n)都不相同时,则任何一个记录的无序序列经排序后得到的结果是唯一的;反之,若待排序的序列中存在两个或两个以上关键字相等的记录时,则排序所得到的记录序列的结果不唯一。假设 ki=kj(1<=i<=n,1<=j<=n, i 不等于 j),且在排序前的序列中 ri 领先于 rj (即i<j)。若在排序后的序列中 ri 仍领先于 rj,则称所用的排序方法是稳定的;反之,若可能使排序后的序列中 rj 领先于 ri ,则称所用的排序方法是不稳定的

根据在排序过程中涉及的存储器不同,可将排序方法分为两大类:(1) 内部排序:在排序进行的过程中不使用计算机外部存储器的排序过程。(2) 外部排序:在排序进行的过程中需要对外存进行访问的排序过程。本文仅讨论各种内部排序的方法。

待排序的记录序列可以用顺序表表示,也可以用链表表示。但是我现在讨论的排序算法一律以下列说明的顺序表为操作对象。
在这里插入图片描述
内部排序的过程是一个逐步扩大记录的有序序列长度的过程。通常在排序的过程中.参与排序的记录序列中可划分为两个区域:有序序列区和无序序列区,其中有序序列区中的记录已按关键字非递减有序排列。使有序序列区中记录的数目增加一个或几个的操作称为一趟排序。下面以选择排序(selection sort)为例剖析内部排序的过程。

在选择排序的过程中,待排记录序列的状态为
在这里插入图片描述
并且有序序列中所有记录的关键字均不大于无序序列中记录的关键字,则第 i 趟选择排序的操作是,从无序序列 R[i…n]的 n-i+1 个记录中选出关键字最小的记录 R[j]和 R[i]交换,从而使有序序列区从 R[1…i-1]扩大至 R[1…i],如图 3.1 所示。

在这里插入图片描述
一躺选择排序的算法如下:
在这里插入图片描述
整个选择排序的过程是一趟选择排序过程的多次重复,融合 SelectPass,其算法如下:
在这里插入图片描述
例如,对下列一组关键字:
在这里插入图片描述
进行选择排序过程中,每一趟排序之后的状况如图 3.2 所示。其中 491和 492表示两个关键字同为 49 的不同记录.
在这里插入图片描述
从上述选择排序的过程可见,在内部排序的过程中主要进行下列两种基本操作:(1)比较两个关键字的大小;(2)将元素从一个位置移动至另一个位置。因此对内部排序的时间复杂度的分析就是以这两种操作的执行次数为依据。从算法 3.1 可见,在第趟选择排序过程中,需进行 n-i次关键字间的“比较”和交换记录时所需的至多 3 次“移动”记录操作。

整个选择排序过程中,需进行n(n-1)/2次关键字间的比较和至多 3(n-1)次移动记录因此它的时间复杂度为 O(n2)。选择排序是在原记录数据空间上通过记录的交换进行的。只在交换记录时需要用一个辅助工作变量,因此它的空间复杂度为 O(1)

内部排序的方法很多,就排序算法的时间复杂度来区分,则可分为三类:(1)简单的排序方法,其时间复杂度为 O(n);(2)先进的排序方法,其时间复杂度为 O(nlogn);(3)基数排序,其时间复杂度为 O(dXn)

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

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

相关文章

MyBatis 表连接查询写法|三种对应关系

❤️作者主页&#xff1a;微凉秋意 ✅作者简介&#xff1a;后端领域优质创作者&#x1f3c6;&#xff0c;CSDN内容合伙人&#x1f3c6;&#xff0c;阿里云专家博主&#x1f3c6; ✨精品专栏&#xff1a;C面向对象 &#x1f525;系列专栏&#xff1a;JavaWeb 文章目录前言表连接…

JS 6万字超详细总结

文章目录1. JS简介2. JS的使用2.1 行内式2.2 内嵌式2.3 外部式3. JS基础语法3.1 注释3.2 变量3.3 输入和输出3.4 数据类型3.4.1 字符串类型3.4.2 数字类型3.4.3 布尔类型3.4.4 Undefined和Null3.4.5 获取变量的类型3.5 数据类型转换3.5.1 转换为字符串类型3.5.2 转换为数字类型…

Java多线程(二)——ReentrantLock源码解析(补充4——条件变量Condition)

ReentrantLock源码解析&#xff08;补充4——条件变量Condition&#xff09; 上一章 ReentrantLock源码解析 仅介绍了 ReentrantLock 的常用方法以及公平锁、非公平锁的实现。这里对上一章做一些补充。主要是&#xff1a; AQS 中阻塞的线程被唤醒后的执行流程可打断的锁 lock…

CDH数仓项目(二) —— 用户行为数仓和业务数仓搭建

0 说明 本文基于《CDH数仓项目(一) —— CDH安装部署搭建详细流程》开始搭建数仓 1 数仓搭建环境准备 1.1 Flume安装部署 1&#xff09;添加服务 2) 选择Flume 3&#xff09;选择依赖 4)选择部署节点 5) 安装完成 1.2 安装Sqoop 1&#xff09;添加服务 2&#xff09;选…

Unity2023 Alpha新功能简介

Unity2023特征&#xff1a;Graphic&#xff1a;添加了新的光线跟踪加速结构。添加实例签名&#xff0c;允许将网格实例添加到GPU光线跟踪的加速结构中。从栅格化管道中渲染网格。HDRP&#xff1a;为HDRP添加了光线追踪地形支持。Eidtor&#xff1a;添加了“聚焦窗口改变”回调到…

spring AOP 原理

一、spring注册 AnnotationAwareAspectJAutoProxyCreator 通过EnableAspectJAutoProxy可以看到先把AspectJAutoProxyRegistrar通过Import注册到spring。 AspectJAutoProxyRegistrar实现了ImportBeanDefinitionRegistrar接口&#xff0c;所以就有了将某个bean引入spring 的能力…

#C. 笨友圈

题目思路1直接模拟题意,相当于邻接矩阵,用bool类型的二维数组vis[i][j]来存储i和j是否为好友,交叉点为1代表是好友,为0代表不是;a[i]存储i这个人看到的信息数量。然后输入后如果符号代表要将u,v加个好友,就将vis[u][v] 1和vis[v][u] 1,如果是拉黑就将vis[u][v] 0和vis[v][u]…

ATAC-seq分析:差异分析(10)

在下部分中&#xff0c;我们将研究如何使用 R/Bioconductor 识别开放区域中的变化。 在这里&#xff0c;我们将采用类似于 Diffbind 中的方法&#xff0c;并在 ATACseq 分析中合理建立。 1. 识别非冗余峰 首先&#xff0c;我们将定义至少 2 个样本中存在的一组非冗余峰&#xf…

ffmpeg为mkv封装格式的音视频文件添加字幕

现在好莱坞的电影&#xff0c;都是全球看&#xff0c;一个地区的人看电影时&#xff0c;电影屏幕上应该展示对应的本地区语言字幕。故电影画面在不同的地区&#xff0c;需要配置不同的语言字幕。故视频画面里面的字幕应该可以拆出来&#xff0c;不能像老版三国演义&#xff0c;…

ZYNQ IP核之RAM

随机存取存储器&#xff08;Random Access Memory&#xff0c;RAM&#xff09;&#xff0c;可以随时把数据写入任一指定地址的存储单元&#xff0c;也可以随时从任一指定地址中读出数据&#xff0c;其读写速度是由时钟频率决定的&#xff0c;主要用来存放程序及程序执行过程中产…

C++结构(OOP的基石)

写在前面 面向初学者撰写专栏&#xff0c;个人原创的学习C/C笔记&#xff08;干货&#xff09;所作源代码输出内容为中文&#xff0c;便于理解如有错误之处请各位读者指正请读者评论回复、参与投票&#xff0c;反馈给作者&#xff0c;我会获得持续更新笔记干货的动力。致粉丝&a…

vulnhub之VENOM:1

1.信息收集 输入arp-scan 192.168.239.0/24探测存活的IP 使用nmap对192.168.239.166进行扫描&#xff0c;发现IP端口21、80、139、443、445。 在浏览器上访问http://192.168.239.166/&#xff0c;查看源码发现类似md5加密。 解密md5可以得到为hostinger。 输入enum4linux …

Linux | 软件包管理器——yum的使用

文章目录一、什么是软件包二、有关软件使用的背景讲解1、如何去下一个软件呢&#xff1f;过程是怎样的&#xff1f;2、软件的商业利益分析3、Linux开源社区的生态链4、Linux中软件的分类和选择三、yum的使用1、说在前面【注意事项】2、如何查看软件包3、软件的安装和卸载四、yu…

WPF鼠标、键盘、拖拽事件、用行为封装事件

WPF鼠标、键盘、拖拽事件、用行为封装事件 本文主要介绍了WPF中常用的鼠标事件、键盘事件以及注意事项&#xff0c;同时使用一个案例讲解了拓展事件。除此之外&#xff0c;本文还讲述如何用行为&#xff08;Behavior&#xff09;来封装事件。 Windows中的事件通过消息机制来完…

新手利用Git上传项目代码到Gitee仓库

【本文发布于https://blog.csdn.net/Stack_/article/details/128770678&#xff0c;未经许可禁止转载&#xff0c;转载须注明出处】 一、安装git工具 【git下载】 【git插件以及插件汉化包下载】 官网下载很慢&#xff0c;已上传CSDN。跳转 或者百度云 链接&#xff1a;https:…

下拉列表支持多选

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>下拉列表支持多选</title> </head> <body bgcolor"antiquewhite"> <center> <…

【算法基础】二分查找算法

一、二分查找算法原理 1. 算法介绍 首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后…

github codespace进行npm start运行开发服的时候无法显示页面(白屏)

github codespace进行npm start运行开发服的时候无法显示页面解决方案 先说答案 必须要指定host为0.0.0.0&#xff0c;因为一般前端开发的时候都是本地访问的&#xff0c;所以npm start 默认启动一个开发服&#xff0c;监听127.0.0.1的请求&#xff0c;也就是localhost。但是…

《Spring揭秘》读书笔记 3:Spring MVC

22 迈向Spring MVC的旅程 【参考】Java Web开发历程。 1) Servlet独行天下的时代。 一个Servlet对应处理一个Web请求。Servlet什么都做。 2) 繁盛一时的JSP时代。 将Servlet中的视图渲染逻辑以独立的单元抽取出来&#xff0c;JSP成为Java Web应用程序事实上的模板化视图标准…

Golang 使用Gin创建Restful API

Golang 使用Gin创建Restful API 今天学习下Go语言如何集成Gin框架编写Restful Web API的基本操作。Gin框架简化了Go原生语言构建Web应用程序的复杂度&#xff0c;在今天的学习中&#xff0c;将学会使用Gin构建路由请求、数据检索、JSON响应封装等最简单的Web服务。 基本要求 …