数据结构学习笔记-十大排序算法

1.插入排序

直接插入排序

//直接插入排序
void InsertSort(int A[], int n){int i,j,temp;for(i=1;i<n;i++)    //将各元素插入已排好序的序列中if(A[i]<A[i-1]){    //若A[i]关键字小于前驱temp=A[i];    //用temp暂存A[i]for(j=i-1;j>=0 && A[j]>temp;--j)    //检查所有前面已排好的元素A[j+1]=A[j];    //所有大于temp的元素都向后挪位A[j+1]=temp;    //复制到插入位置}
}

优化--折半插入排序

//折半插入排序
void InsertSort(int A[],int n){int i,j,low,hight,mid;for(i=2;i<=n;i++){    //依次将A[2]~A[0]插入前面的已排序序列A[0]=A[i];    //将A[i]暂存到A[0];low=1;high=i-1;    //设置折半查找的范围while(low<=high){    //折半查找(默认递增有序)mid=(low+high)/2;    //取中间点if(A[mid]>A[0])high=mid-1;    //查找左半子表else low=mid+1;    //查找右半子表}for(j=i-1;j>=high+1;--j)A[j+1]=A[j];    //统一后移元素,空出插入位置A[high+1]=A[0];    //插入操作}
}

2.希尔排序

//希尔排序
void ShellSort(int A[],int n){int d,i,j;//A[0]只是暂存单元,不是哨兵,当就j<=0时,插入位置已到for(d=n/2;d>=1;d=d/2)    //步长变化for(i=d+1;i<=n;i++)if(A[i]<A[i-d]){    //需将A[i]插入有序增量子表A[0]=A[i];    //暂存在A[0]for(j=i-d;j>0 && A[0]<A[j];j-=d)A[j+d]=A[0];    //记录后移,查找插入的位置A[j+d]=A[0];    //插入}    //if
}

3.冒泡排序

//交换
void swap(int &a,int &b){int temp = a;a = b;b = temp;
}//冒泡排序
void BubbleSort(int A[],int n){for(int i=0;i<n-1;i++){bool flag=false;    //表示本趟冒泡是否发生交换的标志for(int j=n-1;j>i;j--)    //一趟冒泡过程if(A[j-1]>A[j]){    //若为逆序swap(A[j-1],A[j]);    //交换flag=true;}if(flag==false)return;    //本趟遍历后没有发生交换,表明已经有序}
}

4.快速排序

//用第一个元素将待排序序列划分成左右两个部分
int Partition(int A[],int low,int high){int pivot=A[low];    //第一个元素作为枢轴while(low<high){while(low<high && A[high]>=pivot)--high;A[low]=A[high];    //比枢轴大的元素移动到左端while(low<high && A[low]<=pivot)++low;A[high]=A[low];    //比枢轴大的元素移动到右端}A[low]=pivot;    //枢轴元素存放到最终位置return low;    //返回存放到枢轴最终位置
}//快速排序
void QuickSort(int A[],int low,int high){if(low<high){    //递归跳出的条件int pivotpos=Partition(A,low,high);    //划分QuickSort(A,low,pivotpos-1);    //划分左子表QuickSort(A,pivotpos+1,high);    //划分右子表}
}

5.简单选择排序

//简单选择排序
void SelectSort(int A[],int n){for(int i=0;i<n-1;i++){    //一共要进行n-1趟int min=i;    //记录最小元素位置for(int j=i+1;j<n;j++)    //在A[i...n-1]中选择最小的元素if(A[j]<A[min])min=j;    //更新最小的元素位置if(min!=i)swap(A[i],A[min]);    //封装的swap()函数共移动元素3次}
}//交换
void swap(int &a,int &b){int temp = a;a = b;b = temp;
}

6.堆排序

//建立大根堆
void BuildMaxHeap(int A[],int len){for(int i=len/2;i>0;i--)    //从后往前调整所有非终端结点HeadAdjust(A,i,len);
}//将以k为根的子树调整为大根堆
void Headadjust(int A[],int k,int len){A[0]=A[k];    //A[0]暂存子树的根结点for(int i=2*k;i<=len;i*=2){    //沿key较大的子结点向下筛选if(i<len && A[i]<A[i+1])i++;    //取key较大的子结点的下标if(A[0]>=A[i])    break;    //筛选结束else{A[K]=A[i];    //将A[i]调整到双亲节点上k=i;    //修改k值,以便继续向下筛选}}A[k]=A[0];    //被筛选结点的值放入最终位置
}

7.归并排序

归并:把两个或多个已经有序的序列进行排序

核心操作:把数组内的两个有序序列归并为一个

int *B=(int *)malloc(n*sizeof(int));    //辅助数组B//A[low...mid]和[mid+1...high]各自有序,将两个部分归并
void Merge(int A[],int low,int high){int i,j,k;for(k=low;k<=high;k++)B[k]=A[k];    //将A中所有元素复制到B中for(i=low,j=mid+1,k=i;i<=mid&&j<=high;k++){if(B[i]<=B[j])A[k]=B[i++];    //将较小值复制到A中elseA[k]=B[j++];}//forwhile(i<=mid)A[k++]=B[j++];while(j<=high)A[k++]=B[j++];
}void MergeSort(int A[],int low,int high){if(low<high){int mid=(low+high)/2;    //从中间划分MergeSort(A,low,mid);    //从左半部分归并排序MergeSort(A,mid+1,high);    //对右半部分归并排序Merge(A,low,mid,high);    //归并}//if
}

8.基数排序

基数排序得到递减序列的过程如下,

初始化:设置r个空队列,Qr-1,Qr-2,... ,Q0

按照各个关键字位权重递增的次序(个、十、百),对d个关键字位分别做“分配”和“收集”。

分配:顺序扫描各个元素,若当前处理的关键字位=x,则将元素插入Qx队尾。

收集:把Qr-1,Qr-2,...,Q0各个队列中的节点依次出队并链接。

9.外部排序

“归并排序”要求各个子序列有序,每次读入两个块的内容,进行内部排序后写回磁盘。

步骤:生成r个初始归并段(对L个记录进行内部排序,组成一个有序的初始归并段)

进行S趟k路归并,把k个归并段的块读入k个输入缓冲区,用“归并排序”的方法从k个归并段中选出几个最小记录,暂存到输出缓冲区中,当输出缓冲区满时,写出外存。

10.置换-选择排序

步骤:

设初始待排文件为FI,初始归并段输出文件为FO,内存工作区为WA,FO和WA的初始状态为空,WA可容纳w个记录到工作区WA。

1)从FI输入w个记录到工作区WA。

2)从WA中选出其中关键字取最小值的记录,记为MINIMAX记录。

3)将MINIMAX记录输出到FO中去。

4)若FI不空,则从FI输入下一个记录到WA中。

5)从WA中所有关键字比MINMAX记录的关键字大的记录中选出最小关键字记录,作为新的MINIMAX记录。

6)重复3)~5),直至在WA中选不出新的MINIMAX记录为止,由此得到一个初始归并段,输出一个归并段的结束标志到FO中去。

7)重复2)~6),直至WA为空。由此得到全部初始归并段。

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

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

相关文章

【大模型LLM面试合集】大语言模型基础_NLP面试题

NLP面试题 1.BERT 1.1 基础知识 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是谷歌提出&#xff0c;作为一个Word2Vec的替代者&#xff0c;其在NLP领域的11个方向大幅刷新了精度&#xff0c;可以说是近年来自残差网络最优突破性的…

从零搭建Prometheus到Grafana告警推送

目录 一、Prometheus源码安装和动态更新配置 二、Prometheus操作面板和常见配置 三、Prometheus常用监控组件exporter配置 3.1 exporter是什么 3.2 有哪些exporter 3.3 exporter怎么用 3.4 实战 node_exporter ​3.5 其它exporter都怎么用 四、Promethus整合新版Sprin…

算法mq 交互通用校验模块设计

背景 当前与算法交互均通过rocketMQ异步交互&#xff0c;绝大部分场景一条请求mq消息应对应一条返回mq&#xff0c;但由于各种原因&#xff08;消息积压、程序bug&#xff09;&#xff0c;可能会导致返回mq超时未返回或者消息丢失。工程侧针对一些重要场景 case by case的通过…

MySql数据库常用指令合集

MySql数据库常用指令合集 一、创建数据库db11.创建表 字段---表头 student_no,username,sex2.新增单条插入多条插入3.删除4.更新5.查询5.1.查询该表全部信息5.2.查询该表中username&#xff0c;并且要求名字为zhangsan性别女&#xff0c;还可以用&#xff08;or&#xff09; 6.…

卷积神经网络有哪些应用场景

卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;简称CNN&#xff09;的应用场景非常广泛&#xff0c;尤其是在处理具有网格结构的数据&#xff08;如图像、视频&#xff09;时表现出色。以下是一些主要的应用场景&#xff1a; 1. 图像识别与分类 图像分类…

基础权限存储

一丶要求 建立用户组shengcan&#xff0c;其id为 2000建立用户组 caiwu&#xff0c;其id 为2001建立用户组 jishu&#xff0c;其id 为 2002建立目录/sc,此目录是 shengchan 部门的存储目录&#xff0c;只能被 shengchan 组的成员操作4.其他用户没有任何权限建立目录/cw,此目录…

GIT 使用相关技巧记录

目录 1、commit 用户信息变更 全局用户信息&#xff08;没有特殊配置的情况下默认直接用全局信息&#xff09; 特定仓库用户信息&#xff08;只针对于当前项目&#xff09; 方法一&#xff1a;修改config文件 方法二&#xff1a;命令方式 2、idea同一代码推向多个远端仓库…

Ubuntu编译 OSG

目录 一、安装步骤 二、配置 1、数据文件配置 2、OSG环境变量配置 一、安装步骤 在Ubuntu上安装OSG(OpenSceneGraph),你可以按照以下步骤操作: 打开终端,更新你的包管理器的包列表: sudo apt update 安装必要的依赖库 sudo apt install libglu1-mesa-dev freeglu…

Java -- 实现MD5加密/加盐

目录 1. 加密的引出2. MD5介绍3. 解决MD5不可解密方法4. 实现加密解密4.1 加密4.2 验证密码 1. 加密的引出 在MySQL数据库中&#xff0c;一般都需要把密码、身份证、电话号码等信息进行加密&#xff0c;以确保数据的安全性。如果使用明文来存储&#xff0c;当数据库被入侵的时…

8.做pwn题的大致流程

file <文件名> 判断是32还是64位&#xff0c;用对应工具分析&#xff08;比如ida&#xff0c;可以直接把文件拖到对应图标上&#xff09; ida中如果没找到main函数就找start函数从而找到main函数起始地址 两种分析方式&#xff1a; 静态分析ida 动态分析gdb 如果发现…

第七篇——攻谋篇:兵法第一原则——兵力原则,以多胜少

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 微观层面上&#xff0c;也有很多值得深度思考的问题 二、思路&方案 …

CV- 人工智能-深度学习基础知识

一, 深度学习基础知识 1,什么是深度学习?机器学习是实现人工智能的一种途径,深度学习是机器学习的一个子集,也就是说深度学习是实现机器学习的一种方法。2, 传统机器学习算术依赖人工设计特征,并进行特征提取,而深度学习方法不需要人工,而是依赖算法自动提取特征。深度…

一个SQL查询出表结构

select table_schema as “数据库”, table_name as “表名”, table_rows as “记录数”, truncate(data_length / 1024 / 1024,2) as “数据容量(MB)”, truncate(index_length / 1024 / 1024, 2) as “索引容量” from information_schema.tables where table_schema ‘数据…

MuLan:模仿人类画家的多对象图像生成

在图像生成领域&#xff0c;处理包含多个对象及其空间关系、相对大小、重叠和属性绑定的复杂提示时&#xff0c;现有的文本到图像模型仍面临挑战&#xff1a;当文本提示中包含多个对象&#xff0c;并且这些对象之间存在特定的空间关系时&#xff0c;现有模型往往难以准确地捕捉…

6.pwn Linux保护机制

保护机制 CANARY NX ASLR PIE RELRO 回顾 栈的作用为存储函数调用相关信息以及函数的局部变量 这些局部变量通常为数组或者输入的缓冲区(buf)。 而函数调用相关的信息&#xff0c;主要是返回地址和栈底指针(rbp) CANARY 看到程序里readfsqword&#xff08;0x28u&…

Spring 框架的基础知识

Spring 框架是由于软件开发的复杂性而创建的&#xff0c;Spring 使用的是基本的 JavaBean 来完成以前只可能由 EJB 完成的事。从简单性、可测性和松耦合性角度而言&#xff0c;绝大部分Java 应用都可以用 Spring。 1、控制反转&#xff08;Inversion of Control, IOC&#xff0…

差分进化算法

一、简介 差分进化&#xff08;DE&#xff09;是一种算法&#xff0c;通过创建一些随机个体&#xff0c;将它们与预定义的评估指标进行比较&#xff0c;并保留最好的个体&#xff0c;然后通过混合剩余个体的特征来创建新的个体&#xff0c;并重复这个过程来解决全局优化问题。…

嵌入式c语言4——类型修饰符

register&#xff0c;将变量保存在寄存器中&#xff0c;使得访问速度增加 const是常量&#xff0c;static是静态量&#xff0c;volatile是

从0-1实现一个前端脚手架

https://gitee.com/childe-jia/kfc-cli.git gitee完整地址 介绍 为什么需要脚手架&#xff1f; 脚手架本质就是一个工具&#xff0c;作用是能够让使用者专注于写代码&#xff0c;它可以让我们只用一个命令就生成一个已经配置好的项目&#xff0c;而不用我们再花时间去配置和安…

zabbix 与 grafana 对接

一.安装 grafana 1.初始化操作 初始化操作 systemctl disable --now firewalld setenforce 0 vim /etc/selinux/config SELINUXdisabled 2.上传数据包并安装 cd /opt grafana-enterprise-9.4.7-1.x86_64.rpm #上传软件包 yum localinstall -y grafana-enterprise-9.4.7-1…