【排序算法】自顶向下的归并排序

        归并:将两个有序的数组归并成一个更大的有序数组。

        要将一个数组排序,可以先递归的将它分成两半分别排序,然后将结果归并起来,这就是归并排序。归并排序最吸引人的性质是它能够保证将任意长度为N的数组排序所需时间和NlogN成正比,它的主要缺点是它需要额外的与N成正比的空间。

        实现归并的一种直接了当的方法是将两个不同的有序数组归并到第三个数组中。实现的方法很简单,创建一个适当大小的数组然后将两个输入数组的元素一个个从小到大放入这个数组中。

        当归并将一个大数组排序时,我们需要进行很多次归并,因此在每次归并时都创建一个新数组来存储排序结果会带来问题。

        原地归并的数据抽象:

public static void merge(int[] a,int lo,int mid,int hi){int i=lo,j=mid+1;for (int k=lo;k<=hi;k=k+1)aux[k]=a[k];for (int k=lo;k<=hi;k=k+1)if (i>mid)  a[k]=aux[j++];else if (j>hi)  a[k]=aux[i++];else if (aux[j]<aux[i])  a[k]=aux[j++];else   a[k]=aux[i++];list_deal.printArray(a);}

        基于原地归并的抽象实现了一种递归归并:

public class Merge {private static int [] aux;public static void sort(int[] a){aux=new int[a.length];sort(a,0,a.length-1);}public static void merge(int[] a,int lo,int mid,int hi){int i=lo,j=mid+1;for (int k=lo;k<=hi;k=k+1)aux[k]=a[k];for (int k=lo;k<=hi;k=k+1)if (i>mid)  a[k]=aux[j++];else if (j>hi)  a[k]=aux[i++];else if (aux[j]<aux[i])  a[k]=aux[j++];else   a[k]=aux[i++];list_deal.printArray(a);}private static void sort(int[] a ,int lo,int hi){if (hi<=lo) return;int mid=lo+(hi-lo)/2;sort(a,lo,mid);sort(a,mid+1,hi);merge(a,lo,mid,hi);}public static void main(String[] args) {int[] a={534,745,264,864,136,967,254,745,734,269,538,265,825,158,139,100};list_deal.printArray(a);sort(a);list_deal.printArray(a);}
}

排序过程:

534 745 264 864 136 967 254 745 734 269 538 265 825 158 139 100 
534 745 264 864 136 967 254 745 734 269 538 265 825 158 139 100 
534 745 264 864 136 967 254 745 734 269 538 265 825 158 139 100 
264 534 745 864 136 967 254 745 734 269 538 265 825 158 139 100 
264 534 745 864 136 967 254 745 734 269 538 265 825 158 139 100 
264 534 745 864 136 967 254 745 734 269 538 265 825 158 139 100 
264 534 745 864 136 254 745 967 734 269 538 265 825 158 139 100 
136 254 264 534 745 745 864 967 734 269 538 265 825 158 139 100 
136 254 264 534 745 745 864 967 269 734 538 265 825 158 139 100 
136 254 264 534 745 745 864 967 269 734 265 538 825 158 139 100 
136 254 264 534 745 745 864 967 265 269 538 734 825 158 139 100 
136 254 264 534 745 745 864 967 265 269 538 734 158 825 139 100 
136 254 264 534 745 745 864 967 265 269 538 734 158 825 100 139 
136 254 264 534 745 745 864 967 265 269 538 734 100 139 158 825 
136 254 264 534 745 745 864 967 100 139 158 265 269 538 734 825 
100 136 139 158 254 264 265 269 534 538 734 745 745 825 864 967 

        通过过程可以看到,递归归并的过程是将大数组不断分割为小数组,然后循环进行小数组排序、归并。

        对于长度为N的任意数组,自顶向下的归并排序需要进行1/2*NlogN至NlogN次比较。

        对于长度为N的任意数组,自顶向下的归并排序最多需要访问数组6NlogN次。

        对于小数组上,有可能插入排序(或者选择排序)比归并排序更快,所以,插入+递归归并有可能比全递归归并排序快,但是代码也更复杂。

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

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

相关文章

信驰达科技参与《汽车玻璃集成UWB数字钥匙发展研究白皮书》编制工作

为进一步探索汽车数字钥匙技术路线及开发思路&#xff0c;中国智能网联汽车产业创新联盟&#xff08;CAICV&#xff09;、福耀玻璃工业集团股份有限公司联合发起了《汽车玻璃集成UWB数字钥匙发展研究白皮书》研究工作。 2023年12月20日&#xff0c;由中国智能网联汽车产业创新…

PLSQL 把多个字段转为json格式

PLSQL 把多个字段转为json格式 sql Select cc.bm, cc.xm, json_arrayagg(cc.hb) jgFrom (Select aa.bm, aa.xm, json_object(aa.ksbh, aa.wjmc) hbFrom (Select 001 bm, 老六 xm, 0001 ksbh, 文具盒 wjmcFrom dual tUnion AllSelect 001 bm, 老六 xm, 0002 ksbh, 毛笔 wjmcFr…

Linux内核--网络协议栈(二)UDP数据包发送

目录 一、引言 二、数据包发送 ------>2.1、数据发送流程 三、协议层注册 ------>3.1、socket系统调用 ------>3.2、socket创建 ------>3.3、协议族初始化 ------>3.4、对应协议的socket创建 ------------>3.4.1、sock ------>3.5、协议注册 四…

yolo训练voc数据集划分

1、划分数据集比例split_train_val.py import os import random import argparseparser argparse.ArgumentParser() #xml文件的地址或者label的地址&#xff0c;根据自己的数据进行修改 xml一般存放在Annotations下 主要是获取每个数据的地址名字 parser.add_argument(--xml_…

SCRUM产品负责人(CSPO)认证Scrum Product Owner

课程简介 Scrum是目前运用最为广泛的敏捷开发方法&#xff0c;是一个轻量级的项目管理和产品研发管理框架。产品负责人是Scrum的三个角色之一&#xff0c;产品负责人在Scrum产品开发当中扮演舵手的角色&#xff0c;他决定产品的愿景、路线图以及投资回报&#xff0c;他需要回答…

【C语言】详解文件与文件操作

1.什么是文件 文件是记录在外存上的相关信息的命名组合&#xff0c;但是在程序设计中&#xff0c;我们⼀般谈的文件有两种&#xff1a;程序文件、数据文件&#xff08;从文件功能的角度来分类的&#xff09;。 1.1程序文件 程序文件包括&#xff1a; 源程序文件 &#xff0…

AI嵌入式K210项目(9)-DMA

文章目录 前言一、DMA是什么&#xff1f;二、K210的DMA实验过程总结 前言 本章我们来介绍K210的DMA控制器&#xff0c;大家应该都知道在大数据量传输时&#xff0c;如果CPU全程参与&#xff0c;是非常浪费资源的&#xff0c;于是芯片内置了DMAC用做传输控制&#xff0c;CPU仅仅…

Vue面试之v-if与v-show的区别

Vue面试之v-if与v-show的区别 DOM渲染初始渲染性能切换开销标签配合源码实现 最近在整理一些前端面试中经常被问到的问题&#xff0c;分为vue相关、react相关、js相关、react相关等等专题&#xff0c;可持续关注后续内容&#xff0c;会不断进行整理~ 作为Vue中两种条件性渲染元…

使用C++读取SQL Server数据库中的数据并转换为UNICODE类型

要使用C读取SQL Server数据库中的数据并转换为UNICODE类型&#xff0c;可以使用ODBC库和UNICODE编码函数。 首先&#xff0c;确保已安装SQL Server的ODBC驱动程序&#xff0c;并在项目中包含ODBC头文件<sql.h>和<sqlext.h>。 接下来&#xff0c;可以按照以下步骤进…

C#,入门教程(17)——条件语句(if-else)的基础知识

上一篇&#xff1a; C#&#xff0c;入门教程(16)——可变数据类型&#xff08;var&#xff09;的基础知识与使用禁忌https://blog.csdn.net/beijinghorn/article/details/124032216 程序的核心是逻辑。 逻辑的核心是布尔条件表达式。 逻辑的主要体现形式之一是 if-else 语句…

上位机编程:ASCII码精讲

一 ASCII码介绍&#xff1a; ASCII&#xff08;American Standard Code for Information Interchange&#xff09;码是一种使用数字来表示字符的编码标准。它是一种字符编码&#xff0c;将常见的字符映射到数字&#xff0c;以便计算机能够理解和处理文本数据。 ASCII码最初是为…

十大排序算法模板

☆* o(≧▽≦)o *☆嗨~我是小奥&#x1f379; &#x1f4c4;&#x1f4c4;&#x1f4c4;个人博客&#xff1a;小奥的博客 &#x1f4c4;&#x1f4c4;&#x1f4c4;CSDN&#xff1a;个人CSDN &#x1f4d9;&#x1f4d9;&#x1f4d9;Github&#xff1a;传送门 &#x1f4c5;&a…

通信行业无线基本概念

fast roaming&#xff08;快速漫游&#xff09;&#xff1a;使用户在不同的基站&#xff08;access point&#xff09;间可以平滑的切换&#xff0c;在802.11r协议标准中定义。band steering&#xff08;波段转向&#xff09;&#xff1a;在双频段&#xff08;2.4G和5G&#xf…

本地一键部署grafana+prometheus

本地k8s集群内一键部署grafanaprometheus 说明&#xff1a; 此一键部署grafanaPrometheus已包含&#xff1a; victoria-metrics 存储prometheus-servergrafanaprometheus-kube-state-metricsprometheus-node-exporterblackbox-exporter grafana内已导入基础的dashboard【7个…

【SpringBoot系列】AOP详解

🤵‍♂️ 个人主页:@香菜的个人主页,加 ischongxin ,备注csdn ✍🏻作者简介:csdn 认证博客专家,游戏开发领域优质创作者,华为云享专家,2021年度华为云年度十佳博主 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收…

户外火光如何玩转?智能酒精壁炉安全使用攻略大揭秘!

在户外使用智能酒精壁炉是一个别致而令人惬意的选择&#xff0c;但在享受户外炉火带来的温馨时&#xff0c;也需要注意一些安全和使用细节。下面将介绍智能酒精壁炉在户外使用需要注意的事项。 智能酒精壁炉需放置在平坦、通风的户外场地&#xff0c;远离易燃物体&#xff0c;确…

Maven 搭建私服

一、Maven 私服简介 1.1 私服简介 Maven 私服是一种特殊的 Maven 远程仓库&#xff0c;它是架设在局域网内的仓库服务&#xff0c;用来代理位于外部的远程仓库&#xff08;中央仓库、其他远程公共仓库&#xff09;。 当然也并不是说私服只能建立在局域网&#xff0c;也有很多公…

网络部署实战具体学习内容总结

网络部署实战具体学习内容总结 &#x1f4bb;网络部署实战课程通常旨在教授学生如何规划、配置、维护和优化计算机网络。这些课程涵盖了广泛的主题&#xff0c;以确保学生具备网络部署和管理所需的技能。 网络部署实战课程具体学习内容&#x1f447; 1️⃣网络架构设计及网络原…

第一个Python程序_获取网页 HTML 信息[Python爬虫学习笔记]

使用 Python 内置的 urllib 库获取网页的 html 信息。注意&#xff0c;urllib 库属于 Python 的标准库模块&#xff0c;无须单独安装&#xff0c;它是 Python 爬虫的常用模块。 获取网页 HTML 信息 1) 获取响应对象 向百度&#xff08;http://www.baidu.com/&#xff09;发起…

九州金榜|孩子厌学是家庭教育原因还是学校教育原因?

孩子厌学&#xff0c;这是一个让所有家长的头疼的问题&#xff0c;尤其在看到别人家孩子是学霸的时候&#xff0c;就更会有种莫名其妙的伤感&#xff0c;然后回想自己的孩子&#xff0c;仿佛全都是缺点&#xff0c;家长要是有这种想法那就大错特错了&#xff0c;其实每个孩子都…