408复试day2(7大排序算法)

数据结构

7大排序算法总结:
首先排序分为内排序和外排序:
内排序是指待排序的记录放置在内存,而外排序是指排序的过程中需要对内存进行访问。其中稳定的排序有“插冒归”,即插入排序、冒泡排序、归并排序。
1.冒泡排序
算法原理:
①初始时有序区为空,即全部记录为无序区;
②在无序区中从后往前依次比较相邻记录,如果是逆序,则交换
③每趟排序时,无序区关键字最小的记录被逐渐交换到有序区的第一位,即加入到有序区
④如果一趟排序时没有发生过交换,则提前结束
代码实现:

void BubbleSort(ElemType L[],int n){int i,j;bool exchange;//记录是否发生交换的标志ElemType tem;for(i=0;i<n-1;i++){//最多进行n-1趟冒泡排序exchange=false;for(j=n-1;j>i;j--){//一趟冒泡排序if(L[j]<L[j-1]){//前大后小,即逆序就交换tem=L[j];L[j]=L[j-1];L[j-1]=tem;//交换过之后就改变exchange的值exchange=true;}if(exchange==false){return;}}}
}

冒泡排序的算法评价:
1>待排序序列为正序:比较次数n-1,交换次数为0;
2>待排序序列为逆序:比较次数为 n(n-1)/2,交换次数为 n(n-1)/2
2.快速排序
每趟排序使一个元素放入其最终位置,这一个元素称为枢轴,通常选排序的第一个元素。
枢轴把整个序列划分为两个子序列,利用递归分别对子序列重复上述相同过程,直至子序列长度为0或1为止。
划分方法:
选待排序列的第一个元素作为枢轴x
设置变量:
low指向序列的前端
high指向序列的后端
high和low依次从序列的两端交替向序列中央扫描,将小于x的元素移到枢轴的左边,将大于或等于x的元素移到枢轴的右边
代码实现

void QuickSort(ElemType L[],int s,int e){int low=s,high=e;//本次划分范围ElemType x = L[s];//序列第一个元素作为枢轴whlie(low<high){//内循环①从右到左查找比枢轴小的元素while(low<high&&L[high]>=x){high--;}L[low]=L[high];//将小数放在左侧小数序列中,内循环②从左到右查找比枢轴大或相等的元素while(low<high&&L[low]<x){low++;}L[high]=L[low];//将大数放在右侧大数序列中}//循坏结束时low、high重合L[low]=x;//确定枢轴的最终存放位置if(s<low-1) QuickSort(L,s,low-1);//对左侧小数序列进行递归划分if(high+1<e) QuickSort();//对右侧大数序列进行递归划分
}

算法性能分析:
时间复杂度:最好情况,每次都选到的是中间值作为枢轴O(nlog 2 _2 2n);最坏情况,每次总是选到最小或最大元素作枢轴O(n2)
空间复杂度:需要栈空间实现递归
3.归并排序
归并排序将两个或多个有序序列合并为一个新的有序序列的过程,最简单的归并排序就是将两个有序序列合并为一个有序序列的过程,称为二路归并排序。
注意:只含有一个记录的序列显然是有序序列,将一个长度为n的无序序列看成是由n个长度为1的有序子序列组成。
把有些子序列中相邻的子序列两两归并,得到n/2个长度为2的有序子序列。
再把这些子序列两两归并,如此重复,直至形成一个长度为n的有序序列。
算法性能分析:
时间复杂度:O(nlog 2 _2 2n),每一趟归并的时间复杂度为O(n),总共需要进行log 2 _2 2n趟
4.直接插入排序
序列分为有序区和无序区。每次取无序区的第一个元素按其关键字大小插入到有序区的适当位置。
初始时,指定待排序的第一个元素构成有序区。其余元素构成无序区。
每趟排序时,待插入元素为无序区的第一个元素。
从后向前比较,当前元素如大于待插入元素,则向后移动。
每次插入后,有序区增加一个元素,无序区减少一个元素
无序区为空时,排序结束。
性能分析:
基本操作:比较和移动的次数,决定了排序的时间性能。
待排序列为“正序”时,比较和移动的次数最少;
待排序列为“逆序”时,比较和移动的次数最多。
5.简单选择排序
序列分为有序区和无序区。每次从无序区选出关键字最小的元素与无序区的第一个元素交换,此时有序区多一个元素。
要点:
初始时,有序区为空,全部元素位于无序区
每趟排序时,选择无序区关键字最小的元素与无序区的第一个元素交换
每次选择并交换后,有序区增加一个元素,无序区减少一个元素
当无序区剩下最后一个元素时,排序即可结束。
6.希尔排序
本质上是在插入排序算法的基础上进行的改进,就是先将待排序列分割成若干子序列分别进行插入排序,待整个序列中的记录“基本有序“时,再对全体记录进行一次直接插入排序
首先选择一个增量序列t1,t2……tk.令tk=1
按增量序列个数k,对序列进行k趟排序
每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m的子序列,分别对各子表进行直接插入排序。仅增量因子为1时,整个序列作为一个表来处理,表长度即为整个序列的长度。
7.堆排序
即要满足堆积的性质,即子结点的键值一定大于或小于其父结点(根节点),其中每个结点的值大于等于其左右孩子结点的值,称为大根堆(大顶堆),反之,若每个结点的值都小于等于其左右孩子结点的值,称为小根堆(小顶堆)。
原理:
1.将初始待排关键字序列(R1,R2…………Rn)构建成大顶堆,此堆为初始的无序区;
2.将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2…………Rn-1)和新的有序区(Rn),且满足R[1,2,……n-1]<=R[n].
3.由于交换后新的堆顶R[1]可能会违反堆的性质,因此需要对当前无序区调整为新堆,然后再次将R[1]与无序区最后一个元素交换,得到新的无序区和新的有序区。不断重复此过程直到有序区的元素个数为n-1,则排序完。

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

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

相关文章

SIP视频对讲sip广播网关

SV-PA2是专门对行业用户需求研发的一款SIP音视频对讲&#xff0c;媒体流传输采用标准IP/RTP/RTSP协议。它很好的继承了锐科达话机稳定性好、电信级音质的优点&#xff0c;且完美兼容当下所有基于SIP的主流IPPBX/软交换/IMS平台,如Asterisk, Broadsoft, 3CX, Elastix 等。它集多…

安装MySQL 5.7.20

基本上是这个过程&#xff1a;安装配置MYSQL教程 第一种出现报错&#xff1a; mysqld: Can’t create/write to file D: ools\MySQL\mysql-5.7.32-winx64… 错误原因及其修改方法 可以看见在报错的时候文件的路径是不对的&#xff0c;正确的路径应该是D: \tools\MySQL\mysql…

用脚本快速提取补丁文件

目录 windowsLinux 开发过程中有些情况下需要对不同环境中的文件进行替换&#xff0c;就要从本地找出变更文件&#xff0c;同时找出的变更文件还要和服务器上的目录保持一致&#xff0c;如果只变更了个别文件还可以手动处理&#xff0c;但是如果变更文件数很多的时候&#xff0…

低代码开发重要工具:jvs-flow(流程引擎)审批功能配置说明

流程引擎场景介绍 流程引擎基于一组节点与执行界面&#xff0c;通过人机交互的形式自动地执行和协调各个任务和活动。它可以实现任务的分配、协作、路由和跟踪。通过流程引擎&#xff0c;组织能够实现业务流程的优化、标准化和自动化&#xff0c;提高工作效率和质量。 在企业…

【C++】类和对象(中篇)

类和对象 类的六大默认成员函数一、构造函数1. 构造函数的概念2. 构造函数的特性 二、析构函数1. 析构函数的概念2. 析构函数的特性 三、拷贝构造函数1. 拷贝构造函数的概念2. 拷贝构造函数的特征 四、赋值运算符重载1. 运算符重载2. 赋值运算符重载 五、取地址及 const 取地址…

图神经网络(GNN)入门学习笔记(直观且简单)

文章目录 图的定义和表示可以使用图数据结构的问题将图结构用于机器学习的挑战最基本的图神经网络概述汇聚操作基于信息传递的改进图神经网络全局向量信息的利用 本篇文章参考发表于Distill上的图神经网络入门博客&#xff1a; A Gentle Introduction to Graph Neural Network…

R语言从入门到精通之【R语言的使用】

系列文章目录 1.R语言从入门到精通之【R语言介绍】 2.R语言从入门到精通之【R语言下载与安装】 3.R语言从入门到精通之【R语言的使用】 文章目录 系列文章目录一、新手上路1.R语句构成2.获取帮助3.工作空间二、包1.包的安装2.实践应用总结一、新手上路 1.R语句构成 R语句由函…

LeetCode 2050. Parallel Courses III【记忆化搜索,动态规划,拓扑排序】困难

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

多线程之GCD应用

一些套话 GCD全称是Grand Central Dispatch&#xff0c;它是纯 C 语言&#xff0c;并且提供了非常多强大的函数 GCD的优势&#xff1a; GCD 是苹果公司为多核的并行运算提出的解决方案GCD 会自动利用更多的CPU内核&#xff08;比如双核、四核&#xff09;GCD 会自动管理线程的…

SpringBoot+Prometheus+Grafana实现系统可视化监控

场景 SpringBoot中集成Actuator实现监控系统运行状态&#xff1a; SpringBoot中集成Actuator实现监控系统运行状态_springboot actuator 获取系统运行时长_霸道流氓气质的博客-CSDN博客 基于以上Actuator实现系统监控&#xff0c;还可采用如下方案。 Prometheus Prometheu…

Selenium基础篇之屏幕截图方法

文章目录 前言一、用途1.捕获页面错误2.调试测试用例3.展示测试结果4.记录页面状态 二、方法1. save_screenshot2. get_screenshot_as_file3. get_screenshot_as_png4. get_screenshot_as_base64 总结 前言 大家好&#xff0c;我是空空star&#xff0c;本篇给大家分享一下Selen…

CMU 15-445 -- Logging Schemes - 17

CMU 15-445 -- Logging Schemes - 17 引言IndexFailure ClassificationTransaction FailuresSystem FailuresStorage Media Failures Buffer Pool PoliciesShadow Paging: No-Steal ForceWrite-Ahead Log (WAL): Steal No-ForceLogging SchemesCheckpoints小结 引言 本系列为…

IDEA配置远程docker解释器及无编码提示/关联不到python依赖问题

文章目录 1. 修改docker默认配置以支持远程连接2. 配置docker远程解释器3 .IDE配置project SDK4. 本地代码与Linux目录映射5.运行配置 1. 修改docker默认配置以支持远程连接 vim /lib/systemd/system/docker.service,修改docker启动参数 #ExecStart/usr/bin/dockerd -H fd://…

WPF实战学习笔记16-数据加载

新建Update事件&#xff0c;增加Prism事件列表 新建文件Mytodo/Common/Events/UpdateLoadingEvent.cs using Prism.Events; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace Mytodo.Common.…

c++学习(c++11)[24]

c11 列表初始化 #include"iostream" using namepace std;int main() {int x1 1;int x2 { 2 };int x3 { 2 };vector<int> v1 {1,2,3,4,5,6};vector<int> v1 {1,2,3,4,5,6};list<int> lt1 {1,2,3,4,5,6};list<int> lt1 {1,2,3,4,5,6};au…

MySQL - 2、数据操作

0、创建测试表&#xff1a; CREATE TABLE students (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL,age INT,score FLOAT );1、INSERT 插入数据&#xff1a; INSERT INTO students (name, age, score) VALUES(lfsun1, 25, 85.5),(lfsun2, 22, 78.3),(lfsun3,…

HTML5 特性

HTML5 特性 1. 语义化标签 <header>&#xff1a;表示网页或某个区域的页眉部分&#xff0c;通常包含网站的标志、导航菜单等内容。<nav>&#xff1a;表示导航区域&#xff0c;用于包含网站的主要导航链接。<main>&#xff1a;表示网页的主要内容区域&#…

【swift 代码规范】

List item 代码架构分层 一、服务层 1.数据 2.网络请求 3.缓存处理 二、业务层 三、表现层 代码分块 // MARK: - Member Variables// MARK: - Sturct & Lazy Properties// MARK: - Class LifeCycle// MARK: - Class PrivateMethod// MARK: - Class PublicMethod// …

Angular中组件设计需要注意什么?

在 Angular 中设计组件时&#xff0c;有几个重要的方面需要注意。以下是一些建议&#xff1a; 1、单一职责原则&#xff1a;确保每个组件只负责一个明确定义的任务。这有助于保持组件简单、可维护&#xff0c;并且易于重用。 2、组件通信&#xff1a;了解组件之间的通信方式。…

Python(四十九)获取列表指定元素的索引

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…