08数据结构——排序

8.2 插入排序

8.2.1 直接插入排序

直接插入排序(用哨兵)代码如下:

void InsertSort(ElemType A[],int n){int i,j;for(i=2;i<=n;i++)            //依次将A[2]~A[n]插入前面已排序序列if(A[i]<A[i-1]){         //若A[i]关键码小于其前驱,将A[i]插入有序表A[0]=A[i];           //复制为哨兵,A[0]不存放元素for(j=i-1;A[0]<A[j];--j) //从后往前查找待插入位置A[j+1]=A[j];     //向后挪位A[j+1]=A[0];         //复制到插入位置}
}

8.2.2 折半插入排序 

当排序表是有序表时,可用折半查找来确定待插入位置,就可统一地向后移动元素。折半插入排序算法的代码如下:

void InsertSort(ElemType A[],int n){int i,j,low,high,mid;for(i=2;i<=n;i++){            //依次将A[2]~A[n]插入前面的已排序序列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=j-1;j>=high+1;--j)A[j+1]=A[j];          //统一后移元素,空出插入位置A[high+1]=A[0];           //插入操作}
}

8.2.3 希尔排序

希尔排序算法的代码如下: 

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

8.3 交换排序 

8.3.1 冒泡排序

 

冒泡排序算法的代码如下:

void BubbleSort(ElemType 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;                 //本趟遍历后没有发生交换,说明表已经有序}
}void swap(int &a,int &b){           //交换int temp=a;a=b;b=temp;
}

8.3.2 快速排序 

可以递归地调用快速排序算法进行排序,具体的程序结构如下:

void QuickSort(ElemType A[],int low,int high){if(low<high){                             //递归跳出的条件//Partition()就是划分操作,将表A[low...high]划分为满足上述条件的两个子表int pivotpos=Partition(A,low,high);   //划分QuickSort(A,low,pivotpos-1);          //依次对两个子表进行递归排序QuickSort(A,pivotpos+1,high);}
}int Partition(ElemType A[],int low,int high){    //一趟划分ElemType 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;               //返回存放枢轴的最终位置
}

8.4 选择排序 

8.4.1 简单选择排序

简单选择排序算法的代码如下:

void SelectSort(ElemType A[],int n){for(int i=0;i<n-1;i++){            //一共进行n-1趟int min=1;                     //记录最小元素位置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次}
}

8.4.2 堆排序 

 下面是建立大根堆的算法:

void BuildMaxHeap(ElemType A[],int len){for(int i=len/2;i>0;i--)        //从i=[n-2]~1,反复调整堆HeadAdjust(A,i,len);
}void HeadAdjust(ElemType A[],int k,int len){
//函数HeadAjust将元素k为根的子树进行调整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++;if(A[0]>=A[i])  break;     //筛选结束else{A[k]=A[i];             //将A[i]调整到双亲结点上k=i;                   //修改k值,以便继续向下筛选}}A[k]=A[0];                    //被筛选结点的值放入最终位置
}

下面是堆排序算法:

void HeapSort(ElemType A[],int len){BuildMaxHeap(A,len);        //初始建堆for(int i=len;i>1;i--){     //n-1趟的交换和建堆过程Swap(A[i],A[1]);        //输出堆顶元素(和堆底元素交换)HeadAjust(A,1,i-1);     //调整,把剩余的i-1个元素整理成堆}
}

8.5 归并排序和基数排序

8.5.1 归并排序

递归形式的2路归并排序算法是基于分治的,其过程如下:

void MergeSort(ElemType 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
}ElemType *B=(ElemType *)malloc((n+1)*sizeof(ElemType));    //复制数组B
void Merge(ElemType A[],int low,int mid,int high){
//表A的两段A[low...mid]和A[mid+1...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])            //比较B的左右两段中的元素A[k]=B[i++];          //将较小值复制到A中elseA[k]=B[j++];}while(i<=mid) A[k++]=B[i++];    //若第一个表未检测完,复制while(j<=high) A[k++]=B[j++];   //若第二个表未检测完,复制
}

8.5.2 基数排序

        基数排序是一种很特别的排序方法,它不基于比较和移动进行排序,而基于关键字各位的大小进行排序

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

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

相关文章

成都瀚网科技有限公司抖音小店:创新营销引领电商潮流

在当今数字化时代&#xff0c;抖音作为一款备受欢迎的短视频平台&#xff0c;不仅吸引了大量用户的关注&#xff0c;还为众多电商企业提供了新的销售渠道。成都瀚网科技有限公司抖音小店便是其中之一&#xff0c;凭借其独特的营销策略和优质的产品&#xff0c;成为了抖音电商领…

PyCharm改变代码背景图片的使用教程

一个好的集成环境是学习和使用一门编程语言的重中之重&#xff0c;这次我给大家分享如何改变PyCharm软件的代码背景图片。 说明&#xff1a;本教程使用的是汉化版PyCharm软件。 打开PyCharm软件。 点击软件最上方导航栏的文件&#xff0c;然后找到设置。 打开设置然后点击外观…

总结使用React做过的一些优化

一、修改css模拟v-show {!flag && <MyComponent style{{display: none}} />} {flag && <MyComponent />}<MyComponent style{{ display: flag ? block : none }} />二、循环使用key const todosList todos.map(item > {<li key{it…

Web APIs——焦点事件以及小米搜索框

一、事件类型 二、焦点事件 <body><input type"text"><script>const input document.querySelector(input)input.addEventListener(focus,function(){console.log(有焦点触发)})input.addEventListener(blur,function(){console.log(失去焦点触…

如何使用 JMeter 进行 HTTPS 请求测试?

本文将介绍如何使用 JMeter 测试 HTTPS 请求&#xff0c;并提供相关的技巧和注意事项。 在进行性能测试时&#xff0c;很多网站都采用了 HTTPS 协议。当我们测试 HTTPS 请求&#xff0c;如果服务端开启了双向认证&#xff0c;则需要客户端发送请求时带上证书。本文介绍如何在 …

【Axure视频教程】曲线图

今天教大家在Axure制作可视化曲线图的原型模板&#xff0c;鼠标移入曲线图后&#xff0c;会显示弹窗并回显对应折点的具体数据&#xff0c;该模板是用Axure原生元件制作的&#xff0c;所以使用方便&#xff0c;可以任意修改对应样式或者交互效果。该原型模板的具体效果可以参考…

Pytorch--3.使用CNN和LSTM对数据进行预测

这个系列前面的文章我们学会了使用全连接层来做简单的回归任务&#xff0c;但是在现实情况里&#xff0c;我们不仅需要做回归&#xff0c;可能还需要做预测工作。同时&#xff0c;我们的数据可能在时空上有着联系&#xff0c;但是简单的全连接层并不能满足我们的需求&#xff0…

【Docker】Docker学习之一:离线安装Docker步骤

前言&#xff1a;基于Ubuntu Jammy 22.04 (LTS)版本安装和测试 1、Docker安装 1.1、离线安装 步骤一&#xff1a;官网下载 docker 安装包 wget https://download.docker.com/linux/static/stable/x86_64/docker-24.0.6.tgz步骤二&#xff1a;解压安装包; tar -zxvf docker…

谈谈Net-SNMP软件

Net-SNMP是一个开源的SNMP软件套件&#xff0c;它提供了SNMP代理&#xff08;snmpd&#xff09;和SNMP工具&#xff08;如snmpget、snmpwalk等&#xff09;&#xff0c;可以用于监控和管理网络设备。 Net-SNMP最初是从UC Davis的SNMP软件衍生而来&#xff0c;现在已经成为广泛…

小程序设计基本微信小程序的校园生活助手系统

项目介绍 通篇文章的撰写基础是实际的应用需要&#xff0c;然后在架构系统之前全面复习大学所修习的相关知识以及网络提供的技术应用教程&#xff0c;以校园生活助手系统的实际应用需要出发&#xff0c;架构系统来改善现校园生活助手系统工作流程繁琐等问题。不仅如此以操作者…

纺织工厂数字孪生3D可视化管理平台,推动纺织产业数字化转型

近年来&#xff0c;我国加快数字化发展战略部署&#xff0c;全面推进制造业数字化转型&#xff0c;促进数字经济与实体经济深度融合。以数字孪生、物联网、云计算、人工智能为代表的数字技术发挥重要作用。聚焦数字孪生智能工厂可视化平台&#xff0c;推动纺织制造业数字化转型…

【Java集合类面试十八】、ConcurrentHashMap是怎么分段分组的?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;ConcurrentHashMap是怎么…

手把手教你在项目中引入Excel报表组件

摘要&#xff1a;本文由葡萄城技术团队原创并首发。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 前言 GrapeCity Documents for Excel&#xff08;以下简称GcExcel&#xff09;是葡萄城公司的…

【TES641】基于VU13P FPGA的4路FMC接口基带信号处理平台

板卡概述 TES641是一款基于Virtex UltraScale系列FPGA的高性能4路FMC接口基带信号处理平台&#xff0c;该平台采用1片Xilinx的Virtex UltraScale系列FPGA XCVU13P作为信号实时处理单元&#xff0c;该板卡具有4个FMC子卡接口&#xff08;其中有2个为FMC接口&#xff09;&#x…

Vue3.3指北(二)

Vue3.3指北 Vue31、组件基础1.1、全局组件1.2、局部组件1.3、组件的命名1.4、组件的数据存放1.5、组件标签化 2、父组件向子组件传递数据2.1、props2.2、动态props2.3、props传数组2.4、props传对象2.4.1、默认值和必传值 3、子组件向父组件传递数据4、父子组件互相访问4.1、父…

03初始Docker

一、初始Docker 1.什么是Docker 问题 ①大型项目组件复杂&#xff0c;运行环境复杂&#xff0c;部署时依赖复杂&#xff0c;出现兼容性问题。 ②开发&#xff0c;测试&#xff0c;生产环境有差异。不同的环境操作系统不同 解决 ①Docket将应用、依赖、函数库、配置一起打…

聚观早报 | vivo Y100官宣;极氪001 FR将上市

【聚观365】10月25日消息 vivo Y100官宣 一极氪001 FR将上市 特斯拉加速扩张 苹果扩大招聘力度 小米澎湃OS实现历史性跨越 vivo Y100官宣 vivo Y系列是vivo存在比较久的入门系列&#xff0c;主打千元价位的线下市场&#xff0c;在消费者中有着不错的口碑。而不久前一款型…

代码随想录算法训练营第二十九天 | 回溯算法总结

​ 代码随想录算法训练营第二十九天 | 回溯算法总结 1. 组合问题 1.1 组合问题 在77. 组合中&#xff0c;我们开始用回溯法解决第一道题目&#xff1a;组合问题。 回溯算法跟k层for循环同样是暴力解法&#xff0c;为什么用回溯呢&#xff1f;回溯法的魅力&#xff0c;用递…

ubuntu tools

1 cloc calculate lines of your code sudo apt-get install cloccloc ./file

【MySQL架构篇】SQL执行流程与缓冲池

文章目录 1. SQL执行流程2. 数据库缓冲池(Buffer Pool)2.1 缓冲池概述2.2 缓冲池如何读取数据2.3 查看和设置缓冲池的大小2.4 多个Buffer Pool实例2.5 引申问题 1. SQL执行流程 查询缓存&#xff1a;因为查询效率往往不高&#xff0c;所以在MySQL8.0之后就抛弃了这个功能解析器…