数据结构——第8章 排序

1 插入排序

插入排序的基本思想:前i-1个元素已经有序,将第i个数插入到该有序序列中。

例:打扑克牌时,手中的牌已经有序,每抓一张牌,就插入到合适的位置,直到抓完牌。

可以选择不同的方法在已排好序的记录中寻找插入位置:根据查找方法的不同,这里分为直接插入排序(对应顺序查找)折半插入排序(对应折半查找)希尔排序

1.1 直接插入排序

思路:

  1. r[1..n]为待排序的数组,此时,r[1]为有序序列
  2. 循环n-1次,每次使用顺序查找法,查找r[i] (i=2,...,n)在有序序列中的位置,然后插入。(这里的顺序查找,可以从前往后,也可以从后往前——设置监视哨,本文采用后者)
void InsertSort(SqList &L){for(int i=2;i<=L.length;i++){if(L.r[i].score<L.r[i-1].score){L.r[0]=L.r[i];int j;for(j=i-1;L.r[0].score<L.r[j].score;j--){L.r[j+1]=L.r[j];}L.r[j+1]=L.r[0];}} 
}

时间复杂度:O(n^2)

空间复杂度:O(1)

算法特点:稳定算法、也适用于链式存储结构。 

1.2 折半插入排序

思路:

  1. r[1..n]为待排序的数组,此时,r[1]为有序序列
  2. 循环n-1次,每次使用折半查找法,查找r[i] (i=2,...,n)在有序序列中的位置,然后插入。(如果能找到,high为答案) 
void BInsertSort(SqList &L){int low,high,mid; for(int i=2;i<=L.length;i++){L.r[0]=L.r[i];low=1,high=i-1;while(low<=high){mid=(low+high)/2;if(L.r[0].score<L.r[mid].score) high=mid-1;else low=mid+1;}//如果能找到,答案为highint j;for(j=i-1;j>=high+1;j--){//将high之后的有序序列往后挪 L.r[j+1]=L.r[j]; } L.r[j+1]=L.r[0];//插入 } 
}

时间复杂度:O(n^2)

空间复杂度:O(1)

算法特点:稳定、不适用链式结构

1.3 希尔排序

思路:分组插入。对于每一趟,将相隔某个“增量”的记录分为一组,得到多组,每组都用插入排序使之有序。

  1. 第1趟取增量d1,所有间隔为d1的记录分在同一组,在各个组中进行直接插入排序
  2. 第2趟取增量d2(d2<d1),分组,插入排序。
  3. 依次类推,直到增量di为1,所有记录在同一组中进行插入排序。

 

2 交换排序

交换排序的基本思想:两两比较待排序记录的关键字,一旦发现两个记录不满足次序要求时则进行交换,直到整个序列全部满足要求为止。

2.1 冒泡排序

思路:大数下沉。

  1. 待排序数组为r[1..n]。第1趟:首先将第1个记录和第2个记录的关键字进行比较,若为逆序,交换。然后比较第2个和第3个,……,第n-1个和第n个。第1趟结束,最大的数下沉到最后的位置上。
  2. 然后进行第2趟,对前n-1个记录进行同样的操作。
  3. 重复,直至在某一趟排序过程中没有进行交换的操作,说明序列全部有序。(最差情况是进行n-1趟)
void BubbleSort(SqList L){int m=L.length-1;//m表示趟数,一共需要Length-1趟int flag=1;//flag为1表示进行了交换 while(m>0&&flag==1){for(int i=1;i<=m;i++){flag=0;//没有进行交换if(L.r[i].score>L.r[i+1].score){flag=1;L.r[0]=L.r[i];L.r[i]=L.r[i+1];L.r[i+1]=L.r[0];} }m--;}
}

时间复杂度:O(n^2)

空间复杂度:O(1)

算法特点:稳定、也适用于链式结构 

2.2 快速排序

思路:任取一个记录作为轴,将关键字小于它的交换到前面,大于它的交换到后面。最后将轴放在交界处的位置

一趟快排Partition:

  1. 选第1个记录作为轴,暂存在r[0]的位置上。附设两个指针low和high。
  2. 从表的最右端向左搜索。当low<high时,while(r[high].key>=r[0].key),high--。搜索到小于r[0].key时,放到r[low]中(这里的r[low]相当于没有数据)。
  3. 然后从左往右。
  4. 重复2和3,直到low==high,完成一趟。
int Partition(SqList &L,int low,int high){//对顺序表L中的子表r[low..high]进行一趟排序,返回轴的位置 L.r[0]=L.r[low];while(low<high){while(low<high&&L.r[high].score>=L.r[0].score) high--;L.r[low]=L.r[high];while(low<high&&L.r[low].score<=L.r[0].score) low++;L.r[high]=L.r[low];}  L.r[low]=L.r[0];return low;
}
void QSort(SqList &L,int low,int high){//对顺序表L的子序列L[low..high]进行快速排序 int loc;if(low<high){loc=Partition(L,low,high);		QSort(L,low,loc-1);QSort(L,loc+1,high);}
} 
void QuickSort(SqList &L){//对顺序表L进行快速排序 QSort(L,1,L.length); 
}

时间复杂度:O(nlogn)

空间复杂度: O(n) 因为快排是递归的,需要有一个栈来存放相应的数据。

算法特点:不稳定、不适用于链式结构。

3 选择排序

3.1 简单选择排序

3.2 树形选择排序

3.3 堆排序

4 归并排序

5 基数排序(桶排序)

6 外部排序

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

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

相关文章

js 移除字符串中所有的a标签;js 移除字符串中所有的a标签,但是保留a标签包裹的部分

js 移除字符串中所有的a标签 要移除字符串中所有的 <a> 标签&#xff0c;可以使用正则表达式和 String.replace() 方法。以下是实现这一功能的示例代码&#xff1a; function removeATags(str) {return str.replace(/<a\b[^<]*(?:(?!<\/a>)<[^<]*)…

微服务项目雪崩的解决思路

雪崩的介绍 雪崩是微服务中某个服务挂了&#xff0c;无法返回请求&#xff0c;导致调用改服务的上层服务也故障&#xff0c;最终形成连锁反应&#xff0c;导致整个系统故障。 解决思路 一般有四种思路&#xff1a; 1.最简单的就是超时处理&#xff0c;即超过一段时间就返回…

matlab读取中国1km分辨率逐月降水量/逐月平均气温数据集(1901-2022)

开源数据集“中国1km分辨率逐月平均气温数据集&#xff08;1901-2022&#xff09;”和“中国1km分辨率逐月降水量数据集&#xff08;1901-2022&#xff09;”&#xff0c;原始数据格式为NETCDF&#xff0c;即.nc格式&#xff0c;现需要转为tif格式&#xff0c;采用matlab读取&a…

qt c++ 计时器 踩坑实录

目录 main.cpp 指针调用&#xff1a; 类调用踩坑实录 "countdownTimer.h" "countdownTimer.cpp" main.cpp #include <QApplication> #include <QLabel> #include "CountdownTimer.h"int main(int argc, char *argv[]) {QAppli…

JAVA小知识21:单列集合顶层接口Collection的使用

一、Collection简介 Collection是单列集合的顶层接口&#xff0c;所有的单列集合都集成自Collection。 那么什么是单列集合呢&#xff1f;我们上篇文章提到了List与ArrayList&#xff0c;List就是单列集合&#xff0c;他是无需可重复单列集合的顶层抽象类&#xff0c;我们学…

定个小目标之刷LeetCode热题(22)

这道题最容易想的就是排序后再遍历&#xff0c;但是时间复杂度就不是O(n)了&#xff0c;所以还是得用更优的解法&#xff0c;直接看题解&#xff0c;它是使用了HashSet&#xff0c;遍历数组&#xff0c;对于每一个数x&#xff0c;如果不存在x - 1则进入内循环&#xff0c;否则跳…

适合小白学习的项目1906java Web智慧食堂管理系统idea开发mysql数据库web结构java编程计算机网页源码servlet项目

一、源码特点 java Web智慧食堂管理系统是一套完善的信息管理系统&#xff0c;结合java 开发技术和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 前段主要技术 bootstra…

C语言的网络编程

目录 引言 一、TCP/IP概述 1. TCP&#xff08;Transmission Control Protocol&#xff09; 2. UDP&#xff08;User Datagram Protocol&#xff09; 二、Socket编程基础 1. 服务器端 2. 客户端 三、URL与HTTP编程 1. 使用libcurl进行HTTP请求 表格总结 TCP/IP与Socke…

监控易监测对象及指标之:全面监控MongoDB 4数据库

随着大数据时代的来临&#xff0c;MongoDB作为一款高性能的NoSQL数据库&#xff0c;因其灵活的文档模型、水平扩展能力以及丰富的查询语言&#xff0c;已成为众多企业和开发者处理海量数据的首选工具。 断言是MongoDB内部错误检测的重要机制。监控易工具对MongoDB的断言情况进行…

3、进程管理

#什么是进程 进程是程序启动产生的可执行实例 #静态查看进程 ps aux #参数解释 -a 只能查看系统里面运行的所有终端进程 -u 显示进程拥有者 -x 显示系统内所有进程 -f 显示进程间的父子关系 #其中显示的列 VSZ 是进程占用的虚拟内存大小 RSS 是占用的物理大小 ps -ef #参数解释…

aop注解快速实现数据脱敏返回

说明&#xff1a; 公司之前数据接口数据管理不严格&#xff0c;很多接口的敏感数据都没有脱敏处理&#xff0c;直接返回给前端了&#xff0c;然后被甲方的第三方安全漏洞扫出来&#xff0c;老板要求紧急处理&#xff0c;常用的话在单个字段上加上脱敏注解会更加的灵活&#xf…

基于Quartus Prime18.1的安装与FPGA的基础仿真(联合Modelsim)教程

Quartus是一种美国科技公司Intel&#xff08;英特尔&#xff09;公司开发的FPGA&#xff08;现场可编辑门阵列&#xff09;设计编译软件&#xff0c;用作设计、仿真、综合和布局、支持多种编程语言&#xff0c;包括VHDL、Verilog等&#xff0c;并具有丰富的功能和工具库&#x…

SpringCloud学习笔记 - 1、Boot和Cloud版本选型

文章目录 前言需要&#xff08;学习/用到&#xff09;的技术SpringBoot版本的选择我们为什么要使用 Java 17&#xff0c;以及SpringBoot 3.2 呢&#xff1f; SpringCloud 版本的选择SpringCloud 命名规则Springcloud Alibaba 版本的选择如何确定Boot&#xff0c;Cloud&#xff…

C语言实现员工管理系统

员工管理系统 1. 题目要求 设计一个计算机程序&#xff0c;能够实现简单的员工管理功能。 每个员工的信息包括&#xff1a;编号、姓名、性别、出生年月、学历、职务、电话、住址等。系统的功能包括&#xff1a; 文件操作&#xff1a;将数据输出到文件中以及从文件中加载数据查询…

Next.js 加载页面及流式渲染(Streaming)

Next.js 加载页面及流式渲染&#xff08;Streaming&#xff09; 在现代的 Web 应用开发中&#xff0c;用户体验是至关重要的。快速响应的页面加载和流畅的用户界面可以显著提升用户的满意度。而加载页面&#xff08;Loading Page&#xff09;和流式渲染&#xff08;Streaming&…

大模型太贵?找找自己的原因好吧?

什么&#xff1f; 炼个大模型还嫌贵&#xff1f; 到底哪里贵了&#xff01;&#xff1f; 大模型算力贵&#xff1f;哪里贵了&#xff01;&#xff1f; 争先恐后训练大模型&#xff0c; 搞得现在“算力慌”“一卡难求”&#xff0c; 算力当然水涨船高了! “特供版”GPU又…

python format详解

一、format() 内置函数 format(value, format_spec) 其中format_spec参数必须是一个字符串类型的&#xff0c;否则会抛出 TypeError异常如果format_spec参数是一个空的字符串&#xff0c;且value没有实现 __format__(value, format_spec) 实例方法&#xff1b;则该函数结果与…

MYSQL、ORACLE、PostgreSQL数据库对象层次及权限管理对比

文章目录 前言一、PostgreSQL二、MySQL三、Oracle 前言 本文为出于自己扩展、比较、图形化的思维路径自行总结归纳&#xff0c;可能有些细节不太准确&#xff0c;欢迎指正。 MySQL、Oracle、PostgreSQL关系型数据库都有管理员用户、用户、权限管理、表函数索引等数据库对象&am…

hexo实战:(二)个人独立博客优化合集

前言 上次介绍了使用 HexoGitHub Pages&#xff0c;零成本搭建一个专属自己的独立博客网站。我觉得那篇文章是没有入门门槛的&#xff0c;不管你是什么行业&#xff0c;只要想打造个人 IP&#xff0c;又不太想受博客平台约束&#xff0c;那么读完后动手操作一下也能轻松完成。…

图片Base64编码

将图片进行base64编码 在线转换 加头转换并保存为txt import base64 def image_to_base64(image_path):with open(image_path, "rb") as img_file:# 读取图片文件img_data img_file.read()# 对图片数据进行base64编码base64_data base64.b64encode(img_data)# 将…