第七章 排序

news2025/3/13 15:32:02

第七章 排序

  • 概述
  • 插入排序
  • 交换排序
    • 冒泡排序
    • 快速排序
  • 选择排序
    • 直接选择排序
    • 堆排序
  • 归并排序
    • 有序序列合并
    • 二路归并排序
  • 小试牛刀

概述

  • 排序就是将一组对象按照规定的次序(升序或降序等)重新排列的过程,往往为检索服务
  • 相同键值的两个记录在排序前后相对位置的变化情况是排序算法研究中经常关注的一个问题(排序算法的稳定性
  • n个记录的序列{R1,R2,…,Rn},其对应键值序列为{K1,K2,…,Kn},假设Ki=Kj,若在排序前的序列中Ri在Rj之前,即i<j,经过排序后,RI仍在Rj之前,则该排序方法是稳定
  • 排序分为两大类:
    • 内部排序;待排序的记录全部存放在内存中
    • 外部排序 ;待排序记录不全在内存,需要对外存进行访问

插入排序

  • 直接插入排序;依次将每个记录插入到一个已经排好序的有序表中,从而得到一个新的、记录数加1的有序表,算法描述如下:
void StraightInsertSort(List R,int n)
{
//对顺序表R进行直接插入排序
int i,j;
for(i=2;i<=n;i++)	//n为表长,从第二个记录起进行插入
	{
	R[0]=R[i]	//第i个记录复制到岗哨
	j=i-1;
	while(R[0].key<R[j].key)	//与岗哨比较,直到键值不大于岗哨键值
		{
		R[j+1]=R[j];	//将第j个记录赋值给j+1记录
		j--;
		}
		R[j+1]=R[0];	//将第i个记录插入到序列中
	}
}

注:时间复杂度为O(n2);空间复杂度为O(1);直接插入是稳定的

在这里插入图片描述

交换排序

交换排序基本思想:比较两个记录键值的大小,如果这两个键值大小出现逆序,则交换位置

冒泡排序

  • 冒泡排序:将第一个记录键值和第二个记录键值进行比较,若为逆序则替换位置,然后继续比较第二个和第三个记录,直到完成n-1和n个记录的比较交换;称为一趟

在这里插入图片描述

  • 冒泡排序算法描述如下:
void BubbleSort(List R,int n)
{
int i,j,temp,endsort;
for(i=1;i<n-1;i++)
	{
	endsort=0;
	for(i=1;j<=n-1;i++)
		{
		if(R[j].key>R[j+1].key)		//若逆序交换记录
			{
			temp=R[j];
			R[j]=R[j+1];
			R[j+1]=temp;
			endsort=1;
			}
		}
		if(endsort===0) break;
	}
}

注:时间复杂度为O(n2),冒泡排序是稳定的排序方法

快速排序

  • 快速排序:在n个记录中取某一个记录的键值为标准(通常为第一个记录键值),通过一趟排序将小于和大于该值的分为两部分,然后对这两部分记录分别进行快速排序;算法描述如下:
int QuickPartition(List R,int low,int high)
//对R[low],R[low+1],...,R[high]子序进行一趟快速排序
{
x=R[LOW];	//取记录为标准
while(low<high)
{
	while(low<high)&&(R[high].key>=x.key)))	high--;
	R[low]=R[high];		//从尾端比较,比x小的移动到低端
	while((low<high)&&(R[high].key>=x.key))
	R[high]=R[low];		//自首端比较,比x大的移动到右边
}
R[low]=x;	//一趟结束后,将x移动到最终位置
return low;
}

在这里插入图片描述
注:平均时间性能为O(nlog2n);最坏情况下近似于O(n2);对于较大的n值的效果较好

选择排序

选择排序基本思想:每一次在n-i+1(i=1,2,…,n-1)个标记中选取键值最小的记录作为有序序列的第i个记录

直接选择排序

  • 直接选择排序基本思想:在第i次选择操作中,通过n-i次键值间比较,从n-i+1个记录中选出键值最小的记录,并和第i个记录交换,算法描述如下:
void SelectSort(List R,int n)
{
int min,i,j;
for(i=1;i<=n-1;i++)
	{
	min=i;
	for(j=i+1;j<=n;j++)
		if(R[j].key<R[min].key)	min=j;
		if(min!=i)	swap(R[min],R[i];)
	}
}

在这里插入图片描述
注:时间复杂度为O(n2),不适合n比较大的情况

堆排序

堆排序主要思想:将待排序的序列构建成一个最大堆(或最小堆),然后将堆顶元素与最后一个元素交换并调整堆,再将堆顶元素与倒数第二个元素交换并重新调整堆,依次类推,直到所有元素都有序。

  • 堆:若有一个关键字序列{k1,k2,…,kn}满足ki<=k2i,ki<=k2i+1或(ki>=k2i,ki>=k2i+1);其中i=1,2,…,⌊n/2⌋,则称这个n个键值的序列{k1,k2,…,kn}为最小堆(或最大堆)

在这里插入图片描述
注:堆排序不稳定

归并排序

  • 归并排序要求待排序列由若干个有序子序列组成

有序序列合并

核心操作是两个有序子序列的合并,假设两个有序序列ah,…,am和am+1,…,an,对应键值分别满足Kh<=…<=Km,Km+1<=…<=Kn,合并成一个有序序列Rh,…,Rn;使得合并序列键值满足Kh<=…<=Kn

算法执行时间为O(n-h+1)

二路归并排序

  • 二路归并排序基本思想:假设序列有n个记录,可看作是n个有序的子序列,每个序列长度为1,首先将每相邻的两个记录合并,得到⌈n/2⌉个较大的有序子序列,每个子序列包含两个记录,再将上述子序列两两合并,如此重复直到得到一个长度为n的有序序列为止

在这里插入图片描述

  • 二路归并排序算法描述:
void MergeSort(List a,int n)
{
m=1;	//子序列长度,初始为1
while(m<n)
	{
	MergePass(a,b,n,m);
	m=2*m;
	MergePass(b,a,n,m);
	m=2*m;
	}
}

注:二路归并排序是稳定的,时间复杂度为O(nlog2n);n较大是,归并排序时间性能优于堆排序

小试牛刀

  • 记录数为n,冒泡排序算法在最好情况下所做比较次数为____
  • 按照排序过程中依据不同原则对内部排序方法进行分类,主要有______、_、_______等四类
  • 对于给定的一组键值:83,40,63,13,84,35,96,57,39,79,61,15,分别画出应用直接插入排序、直接选择排序、冒泡排序、归并排序对上述序列进行排序过程

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

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

相关文章

索引背后的数据结构——B+树

为什么要使用B树&#xff1f; 可以进行数据查询的数据结构有二叉搜索树、哈希表等。对于前者来说&#xff0c;树的高度越高&#xff0c;进行查询比较的时候访问磁盘的次数就越多。而后者只有在数据等于key值的时候才能进行查询&#xff0c;不能进行模糊匹配。所以出现了B树来解…

SQL数据库管理工具RazorSQL mac中文版特点与功能

RazorSQL mac是一款功能强大的SQL数据库管理工具&#xff0c;它支持多种数据库&#xff0c;包括MySQL、Oracle、Microsoft SQL Server、SQLite、PostgreSQL等。 RazorSQL mac 软件特点和功能 多种数据库支持&#xff1a;RazorSQL支持多种数据库&#xff0c;用户可以通过一个工…

故障预测与健康管理(PHM)在工业领域的发展前景

故障预测与健康管理&#xff08;PHM&#xff09;作为一种关键技术&#xff0c;已经在工业领域引起了广泛的关注和应用。PHM利用传感器、数据科学和智能算法等技术手段&#xff0c;通过实时监测和分析设备和系统的状态&#xff0c;提前发现潜在故障&#xff0c;并采取适当的维修…

制作linux系统内部yum源仓库

需求说明 制作内网linux系统yum源仓库&#xff0c;比较简单的方式就是添加系统镜像&#xff0c;此种yum配置方式可参考文章 https://blog.csdn.net/d1240673769/article/details/108477661 如果无法提供系统镜像&#xff0c;那该如何创建内网的yum源仓库呢&#xff1f;本文提…

互联网Java工程师面试题·Java 总结篇·第六弹

目录 56、TreeMap 和 TreeSet 在排序时如何比较元素&#xff1f;Collections 工具类中的 sort()方法如何比较元素&#xff1f; 57、Thread 类的 sleep()方法和对象的 wait()方法都可以让线程暂停执行&#xff0c;它们有什么区别? 58、线程的 sleep()方法和 yield()方法有什…

在nodejs中实现双重身份验证机制

在nodejs中实现双重身份验证机制 双重身份验证(Two-factor authentication)是一种安全机制&#xff0c;它要求用户提供两种不同的身份验证因素来访问他们的帐户&#xff1a;密码和发送到他们的移动设备的验证码。在本文中&#xff0c;我们将一步步通过使用speakeasy在nodejs中实…

deforum + kandinsky = 视频工作流

像搭积木一样玩AI&#xff0c;随着模型种类的不断丰富&#xff0c;不同的组合会带来什么惊喜&#xff1f;今天和大家分享最近看到的一个视频工作流&#xff08;工具箱&#xff09;。 首先&#xff0c;我们先对deforum和kandinsky做一些基本的介绍&#xff1a; deforum-art/defo…

【论文解读】单目3D目标检测 CUPNet(ICCV 2021)

本文分享单目3D目标检测&#xff0c;CUPNet 模型的论文解读&#xff0c;了解它的设计思路&#xff0c;论文核心观点&#xff0c;模型结构&#xff0c;以及效果和性能。 目录 一、CUPNet简介 二、论文核心观点 三、模型框架 四、损失函数 五、核心观点——3D高度估计误差 引…

Python之并发编程(进程)

文章目录 一、操作系统的发展史二、进程基础(操作系统中的概念)1.什么是进程2.进程的调度算法3.进程的并行与并发4.进程的三状态5.同步异步6.阻塞与非阻塞7.同步异步与阻塞非阻塞综合使用 三、如何创建进程Process的几个方法如何开启多进程进程间的数据默认隔离基于TCP协议的高…

【Qt控件之QButtonGroup】概述及使用

概述 QButtonGroup 类提供了一个容器来组织一组按钮部件。 QButtonGroup 提供了一个抽象容器&#xff0c;可以将按钮部件放置其中。它不提供此容器的可视表示&#xff08;请参见 QGroupBox&#xff0c;用于容器部件&#xff09;&#xff0c;而是管理组中每个按钮的状态。 一个…

Electron webview 内网页 与 preload、 渲染进程、主进程的常规通信 以及企业级开发终极简化通信方式汇总

Electron 嵌入的页面中注入的是 preload.js 通过在标签中给 prelaod赋值&#xff0c;这里提到了 file://前缀&#xff0c;以及静态目录 static 怎么获取 实际代码&#xff0c;其中__static就是我们存放静态文件的地方&#xff0c;这个 static 是 electron 源代码根目录下的文件…

使用unordered_write调优RocksDB写性能

在使用rocksdb存储的服务中&#xff0c;我们发现QPS在4w/s就怎么调整都上不去了&#xff0c;写性能受到了某种限制。为什么呢&#xff1f;下图描述了rocksdb写入的流程。我们发现 unordered_write true可以提高写入吞吐量。 rocksdb的数据正常写入流程是&#xff0c;多个线程形…

九月 NFT 行业解读:熊市情绪仍占上风

作者: stellafootprint.network 9 月&#xff0c;著名主流媒体《滚石》&#xff08;Rolling Stone&#xff09;发表了一篇题为《你的 NFT 实际上——终于——完全不值钱了》&#xff08;Your NFTs Are Actually — Finally — Totally Worthless&#xff09;的文章&#xff0c…

【网络编程】从网络编程、TCP/IP开始到BIO、NIO入门知识(未完待续...)

目录 前言前置知识一、计算机网络体系结构二、TCP/IP协议族2.1 简介*2.2 TCP/IP网络传输中的数据2.3 地址和端口号2.4 小总结 三、TCP/UDP特性3.1 TCP特性TCP 3次握手TCP 4次挥手TCP头部结构体 3.2 UDP特性 四、总结 课程内容一、网络通信编程基础知识1.1 什么是Socket1.2 长连…

NumPy基础及取值操作

目录 第1关&#xff1a;ndarray对象 相关知识 怎样安装NumPy 什么是ndarray对象 如何实例化ndarray对象 使用array函数实例化ndarray对象 使用zeros&#xff0c;ones&#xff0c;empty函数实例化ndarray对象 代码文件 第2关&#xff1a;形状操作 相关知识 怎样改变n…

液压自动化成套设备比例阀放大器

液压电气成套设备的比例阀放大器是一种电子控制设备&#xff0c;用于控制液压动力系统中的液压比例阀1。 比例阀放大器通常采用电子信号进行控制&#xff0c;以控制比例阀的开度和流量&#xff0c;以实现液压系统的可靠控制。比例阀放大器主要由以下组成部分&#xff1a; 驱动…

tomcat 服务器

tomcat 服务器 tomcat: 是一个开源的web应用服务器。区别nginx&#xff0c;nginx主要处理静态页面&#xff0c;那么动态请求&#xff08;连接数据库&#xff0c;动态页面&#xff09;并不是nginx的长处&#xff0c;动态的请求会交给tomcat进行处理。 nginx-----转发动态请求-…

Golang学习:基础知识篇(三)—— Map(集合)

Golang学习&#xff1a;基础知识篇&#xff08;三&#xff09;—— Map集合 前言什么是Golang&#xff1f;Map集合定义 Map综合实例补充 前言 很久之前就想学Go语言了&#xff0c;但是一直有其他东西要学&#xff0c;因为我学的是Java嘛&#xff0c;所以后面学的东西一直是跟J…

Element-UI 日期选择器--禁用未来日期

在做项目的时候经常会遇到一些报表需要填写日期&#xff0c;一般是填写当日及当日以前&#xff0c;这时候我们的日期选择器就需要进行一些限制&#xff0c;比如&#xff1a; 这样之后&#xff0c;就不会误填写到明天啦&#xff0c;下面让我们看一下代码实现 html页面代码 这里…

Unity ECS最新DOTS环境搭建教程

最近DOTS终于发布了正式的版本, 今天我们来基于Unity 2023.1.6来搭建DOTS 1.0.16的开发环境与注意事项。 对啦&#xff01;这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白&#xff0c;也有一些正在从事游戏开发的技术大佬&#xff0c;欢迎你来交流学习。 1…