合并排序

合并法排序 合并法排序(Merge Sort)是一种基于分治思想的排序算法,其原理如下:1.将待排序数组分成两个子数组,每个子数组包含大约相等数量的元素。2.递归地对子数组进行排序,直到每个子数组的大小为1。3.将已排序的子数组合并成一个新的排序数组,合并过程中按照从小到大的顺序逐个比较两个子数组中的元素,并将较小的元素放入新数组中,直到所有元素都被放入新数组中。4.最终得到一个有序数组。合并排序的时间复杂度是O(nlogn),其中n是待排序数组的长度。它的空间复杂度是O(n)。 阅读详情
#include<stdio.h>
#include <memory.h>


void merge(int a[],int p,int q,int r);
void mergearray(int a[],int p,int r);


void main()
{
    int a[]={9,10,7,6,1,4,3,2,1,0},p,r,i;
    
    p=0;
    
    r=sizeof(a)/sizeof(int);
    
    mergearray(a,p,r-1);
    for(i=0;i<r;i++)
        printf("%d ",a[i]);
    
    printf("\n");
}
void merge(int a[],int left,int middle,int right)
{
    int temp[10],k=left,i=left,j=middle+1,h;
    memset(temp,NULL,sizeof(int)*10); // 清空
   
    while (i<=middle && j<=right)
  {
        if (a[i]<=a[j])
        {
            temp[k]=a[i];
            i++;

        }
        else
        {
           temp[k]=a[j];
           j++;
        }
        k++; 
//排到的位置
    }
 
      if (i>middle) // i前的数据已经拍好,则只需要排j后的,但j后的是已经拍好的
        for (h=j;h<=right;h++)
        {
            temp[k]=a[h];
            k++;
printf("i= %d ; middle = %d\n ", i , middle );
printf("i>middle \n");
        }
    else
        for (h=i;h<=middle;h++)
        {
            temp[k]=a[h];
            k++;
        }
for (k=left;k<=right;k++)
            a[k]=temp[k];


}


void mergearray(int a[],int left,int right)
{
    int middle;
    if(left<right)
    {
        middle=(left+right)/2;
        mergearray(a,left,middle);
        mergearray(a,middle+1,right);
        merge(a,left,middle,right);
    }
}
欢迎进入C/C++编程社区论坛,与300万技术人员互动交流 >>进入

    合并排序是一个O(nlogn)的算法,其基本思想就是一个分治的策略,先进行划分,然后再进行合并,下面举个例子。

    有这样一组数据,{5,4,1,22,12,32,45,21},如果对它进行合并排序的话,首先将它从中间分开,这样,它就被分成了两个数组{5,4,1,22} {12,32,45,21}.

    对这两个数组,也分别进行这样的操作,逐步的划分,直到不能再划分为止(每个子数组只剩下一个元素),这样,划分的过程就结束了。

    划分的过程如下图所示:

    接下来,我们进行合并操作,依照上图,划分过程是从上到下进行的,而合并的过程是从下往上进行的,例如上图中,最下层{5},{4}这两个数组,如果按升序排列,将他们合并后的数组就是{4,5}。{1},{22}这两个子数组合并后是{1,22}。而{4,5}与{1,22},这两个数组同属一个分支,他们也需要进行合并,由于这两个子数组本身就是有序的,所以合并的过程就是,每次从待合并的两个子数组中选取一个最小的元素,然后把这个元素放到合并后的数组中,前面两个数组合并后就是{1,4,5,22}。依次类推,直到合并到最上层结束,这是数据的排序已经完成了。

    合并的过程如下图所示。这个过程是从下往上的。

    

Java实现合并排序 1 问题描述 给定一组数据,使用合并排序得到这组数据的非降序排列。 2 解决方案 2.1 合并排序原理简介 引用自百度百科: 合并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 合并排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序... 阅读详情

相关推荐

合并排序的c++实现

用递归实现合并排序

h_qingjia的博客 2752

合并算法

**原理** 1. 将长的排序序列分割成单个子序列(最小子序列是单个数字) 2. 采用递归思路,逐个先递归左边(排好序),其次递归右边(排好序) 3. 递归遍历如下图 4.代码结果见下图 //归并排序 #include <iostream> using namespace std; //拆分,把r...

weixin_34117522的博客 1389

Unity UGUI深度优化

Unity UGUI优化相关

不定时分享所学所得,包括游戏开发和其他收获! 2717

计算资源合并模式——云计算架构常用设计模式

背景     云计算的解决方案中,最初设计可能有意遵循关注点分离的设计原则,把操作分解为独立的计算单元以便可以单独托管和部署。然而,虽然这种策略可以帮助简化解决方案的逻辑实现,但是在同一个应用程序中要部署大量的计算单元,这会增加运行时的托管成本,并且使得系统管理复杂化。另外,这种方法也可能不是最合乎经济效益的解决方案,会导致系统空闲或低使用率。 目的 &nb...

JiaYue博客 721

2026.3.10:最新claude code完美解决方案,跳过登录界面,使用国内deepseek-v4-pro进行计费

本文介绍了一种绕过Claude登录界面直接使用国内DeepSeek-V4-Pro服务的解决方案。通过npm全局安装@anthropic-ai/claude-code包,并配置5个关键环境变量:API认证令牌、基础URL(指向DeepSeek服务)、指定模型为deepseek-v4-pro、禁用非必要流量等。文中提供了4张配图辅助说明配置过程,但未展示具体内容。该方案可实现直接计费使用,无需通过官方登录流程。

拥抱具身智能,昇腾Ascend C 6502

Android 13 Settings蓝牙列表卡顿问题排查及优化过程

此时我们的卡顿优化基本完成了,我们应该要考虑内存是否会泄漏,如果大家不知道哪些需要回收可以用leakcanary和android profiler进行内存检测,看代码有没有内存泄漏。

龚礼鹏的博客 2546

详解自然合并排序

既然是详解自然合并排序,那就一步一步讲解算法: (‾◡◝) 学习自然合并排序,首先我们要先知道: 自然合并排序和合并排序的区别: 合并排序 : 是将两个(或两个以上)有序表合并成一个新的有序表 自然合并排序: 就是在合并排序时,建立子数组段,通过数组已排序的(自然排序,不重新排序)子数组段。 下面通过步骤讲解自然合并排序到底是怎样操作的:( ﹁ ﹁ ) ~→ 自然合并排序步骤: 简单的说,自然...

shengshengxiaowang的博客 3528

《UDS协议从入门到精通》系列——图解0x34:请求下载

上传下载类服务之0x34-请求下载,图解请求+响应格式,直观易懂,快速上手!!

车载系统攻城狮 4927

递归排序(合并排序)

1. 递归排序(合并) 合并排序是分而治之的排序算法。它是一种高效,基于比较的排序算法。 它的工作原理如下: 将列表划分为每次迭代中大约一半大小的子列表,直到每个子列表只有一个元素。 重复合并每个子列表以创建排序列表。它将一直运行,直到我们只有一个排序列表。这将是排序列表。 如下图 2. 代码实现 import java.util.Arrays; public class MergeSor...

我和这个时代的故事 1万+

YOLOv10精度上不去?QAT量化感知训练全流程,INT8推理mAP只掉0.8%

普通PTQ量化虽简单,但无法应对YOLOv10的小目标特征和激活分布波动,导致精度暴跌。QAT通过“模拟量化误差+联合优化权重与量化参数”,让INT8模型精度接近FP16,同时速度提升1.8倍,完美适配实时检测场景(如安防监控、自动驾驶)。该流程已在工业级项目中验证,针对YOLOv10的优化策略(敏感层保护、小目标加权、分阶段训练)可直接迁移至其他YOLO系列(v8/v9),量化后精度损失均可控制在1%以内。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 915

Flink实战(101):双流join(三)双流中实现Inner Join、Left Join与Right Join

声明:本系列博客是根据SGG的视频整理而成,非常适合大家入门学习。 《2021年最新版大数据面试题全面开启更新》 简介 之前文章中提到JoinedStream与CoGroupedStream,例如下列代码: dataStream.join(otherStream) .where(0).equalTo(1) .window(TumblingEventTimeWindows.of(Time.seconds(3))) .apply { ... } 由于joinedStream与

微信搜:import_bigdata,大数据领域硬核原创作者 736

合并排序算法排序过程_基本算法:合并排序

合并排序算法排序过程 每个程序员都需要了解他们的算法和数据结构。 在研究它们时,您需要确保确切了解它的功能,时间和空间的复杂性以及采用这种方式的原因,并且不仅能够对其进行编码,而且能够手动执行。 这就是基本算法的全部意义。 欢迎来到基本算法的第一次安装,今天在这里,我们将介绍合并排序。 合并排序是用于对大型数据集进行排序的最可靠的一致且性能最佳的排序算法之一,比起快速排序平均而言, 最糟糕的...

编程故事的地方 7756

uniapp [安卓苹果App端] - 详细实现手机蓝牙连接打印机及打印票据小票/标签/面单/热敏小票订单/快递单等通用兼容适配解决方案,Uniapp对接蓝牙打印机支持各种主流品牌及打印指令,强悍插件

uni-app,安卓Android,苹果ios,安卓app端,苹果App端,uniapp苹果app,蓝牙打印机,uniappAPP实现通过蓝牙连接打印机打印,uniapp蓝牙连接打印机,安卓蓝牙打印插件,蓝牙打印机,蓝牙ble低功率及高功率打印机小票、标签、面单打印,手机PDA蓝牙打印插件,连接蓝牙打印机,蓝牙连接,打印文本、图片、条码、二维码,兼容斑马打印机、佳博打印机,TSC打印机,免费蓝牙打印机组件,蓝牙打印条码,蓝牙打印机连接,热敏蓝牙打印机,便携式打印机,打印机搜索不到,连接失败,发送打印命令

🏆 前端领域优质创作者 1万+

Python合并排序

Here you will learn about python merge sort algorithm. 在这里,您将了解python合并排序算法。 Merge sort is based on divide and conquer technique. 合并排序基于分而治之。 All we have to do is divide our array into 2 parts or ...

culing2941的博客 1744

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

合并排序与快速排序

合并排序算法又叫归并排序,是用分治策略实现对n个元素进行排序的算法将待排序元素分成大小大致相同的两个子集合,分别对两个子集合进行排序,最终将排好序的子集合合并成所要求的排好序的集合。 合并方法是循环的将两个有序子序列当前的首元素进行比较,较小的元素取出,置入合并序列的左边空置位,直至其中一个子序列的最后一个元素置入合并序列中。最后将另一个子序列的剩余元素按顺序逐个置入合并序列尾部即可完成排序。(二分法) 由于排序问题的计算下界为Ω(nlog n),所以合并排序是一个渐进最优算法 /* input 10 10

weixin_53113130的博客 3512

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

合并排序Java实现

在计算机科学中,合并排序(通常拼写为mergesort)是一种基于O(n log n)比较的排序算法。大多数实现产生稳定的排序,这意味着实现保留排序输出中相等元素的输入顺序。Mergesort是一种分而治之的算法。划分和征服算法将原始数据划分为较小的数据集来解决问题。 在Mergesort过程中,集合中的对象分为两个集合。要拆分集合,Mergesort将占据集合的中间位置,并将集合拆分为左侧和右...

javaZhong的博客 2143

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

排序算法之合并排序

合并排序法 (Merge Sorting) 是外部排序最常使用的排序方法。 主要应用场景是:若数据量太大无法一次完全加载内存, 可使用外部辅助内存来处理排序数据,主要应用在文件排序。 排序方法: 将欲排序的数据分别存在数个文件大小可加载内存的文件中, 再针对各个文件分别使用“内部排序法” 将文件中的数据排序好写回文件。 再对所有已排序好的文件两两合并, 直到所有文件合并成一个文件后, 则...

shao15232的博客 2375

自然合并排序

自然合并排序算法是对合并排序算法的一种改进。设 a[0:n-1]是无序数组,用一次对数组a的扫描可以找出其中 自然排好序的子数组,然后将相邻的排好序的子数组段两 两合并,继续合并相邻排好序的子数组段,直至将整个数 组排好序。 code: #include <algorithm> #include <iostream> using namespace std; in...

成龙大侠的博客 682
上一篇: C++:STL标准入门汇总
下一篇: 快排
laohan_
博客等级 码龄15年 112粉丝 224原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值