插入排序还是归并排序

八大排序之插入排序和归并排序 直接插入排序的特性总结:1. 元素集合越接近有序,直接插入排序算法的时间效率越高2. 时间复杂度:O(N^2)3. 空间复杂度:O(1),它是一种稳定的排序算法4. 稳定性:稳定。 阅读详情

【InsertionSort_MergeSort——PTAques的文件名】

7-1 插入排序还是归并排序

根据维基百科的定义:

插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。

归并排序进行如下迭代操作:首先将原始序列看成 N 个只包含 1 个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下 1 个有序的序列。

现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法?

输入格式:

输入在第一行给出正整数 N (≤100);随后一行给出原始序列的 N 个整数;最后一行给出由某排序算法产生的中间序列。这里假设排序的目标序列是升序。数字间以空格分隔。

输出格式:

首先在第 1 行中输出Insertion Sort表示插入排序、或Merge Sort表示归并排序;然后在第 2 行中输出用该排序算法再迭代一轮的结果序列。题目保证每组测试的结果是唯一的。数字间以空格分隔,且行首尾不得有多余空格。

输入样例 1:

10
3 1 2 8 7 5 9 4 6 0
1 2 3 7 8 5 9 4 6 0

输出样例 1:

Insertion Sort
1 2 3 5 7 8 9 4 6 0

输入样例 2:

10
3 1 2 8 7 5 9 4 0 6
1 3 2 8 5 7 4 9 0 6

输出样例 2:

Merge Sort
1 2 3 8 4 5 7 9 0 6

 

思路:实现insertion和merge,每一次迭代和B作一次比较,

如果相等则做标记,再走一轮则停止。【会改变输入的A,所以直接return,但是最先构造两个A,以防验证两次。】

如果不相等,则ans=-1不变,走merge。

merge算法借鉴网上不是很懂,其余注释写在文章中【有一个错误MD找了好TM久】。

#include <iostream>

using namespace std;
//int C[100]={0};
int ans=-1;
void swap(int* A,int j ,int i){
    int temp=A[j];
    A[j]=A[i];
    A[i]=temp;
}
void insertion(int* A, int* B, int n){   //为了每次写完都比较,所以每次迭代完都比较一次
    int flag2=0;
    for (int i=1;i<n;i++){  //第0个可以不用排
        int flag=0;
        for (int j=i;j>0;j--){
            if (A[j]<A[j-1])
                swap(A,j,j-1);
        }


        for (int i=0;i<n;i++){
            if(A[i]!=B[i]){
                flag=1;
                break;
            }
        }

        if (flag2==1){
//           for (int i=0;i<n;i++)
//               C[i] = A[i];
           return; //记录了下一轮,该程序结束
        }
        if (flag==0) {
            ans=1;
            flag2=1;//再进行下一轮
        }
    }

}


void mergeSortHelper(int* A, int head1, int head2, int tail2){
    int tail1 = head2-1, index=0,len=tail2-head1+1,start=head1;
    int temp[len];
    while(head1 <= tail1 || head2 <= tail2){
        if (head1 > tail1)
            temp[index++]=A[head2++];
        else if(head2 > tail2)
            temp[index++]=A[head1++];
        else{
            if(A[head1] <= A[head2])
                temp[index++]=A[head1++];
            else
                temp[index++]=A[head2++];
        }
    }
    for (int i=0;i<len;i++)
        A[start+i]=temp[i];
}

void merge(int* A, int* B, int n){  //迭代法的归并排序,
    //首先将原始序列看成 N 个只包含 1 个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下 1 个有序的序列。
    //网上借鉴,不是很懂????
    int flag2=0;
    for (int step=1; step<=n; step <<= 1){
        int flag=0;
        int offset = step+step;
        for (int index=0;index<n;index+=offset)
            mergeSortHelper(A,index,min(index+step,n-1),min(index+offset-1,n-1));

        for(int i=0;i<n;i++){
            if (A[i]!=B[i]){
                flag=1;
                break;
            }
        }

//        for (int i=0;i<n-1;i++)
//            cout<<A[i]<<" ";
//        cout<<A[n-1]<<endl;

        if (flag2==1){
            return; //又迭代了一轮,故停止。A在此过程中是一直被改变的
        }
        if (flag==0){   //操!!!这里一直写的1,怪不得是错的。只要不等就认定了。
            flag2=1; //在这里相等了
        }
    }

}

int main()
{
    int N;
    cin >> N;
    int A[N],B[N];
    int A1[N];
    for (int i=0;i<N;i++){
        cin >> A[i];
        A1[i] = A[i];
    }
    for (int i=0;i<N;i++)
        cin >> B[i];

    insertion(A1,B,N);
    if (ans!=-1){
        cout<<"Insertion Sort"<<endl;
        for (int i=0;i<N-1;i++)
            cout<<A1[i]<<" ";
        cout<<A1[N-1]<<endl;
    }
    else{//肯定就时merge的情况
        merge(A,B,N);
        cout<<"Merge Sort"<<endl;
        for (int i=0;i<N-1;i++)
            cout<<A[i]<<" ";
        cout<<A[N-1]<<endl;
    }
//    int A[9]={8,6,4,2,9,1,0,-2,5};
//    int B[9]={0};
//    merge(A,B,9);
//    for (int i=0;i<7;i++)
//        cout<<A[i]<<" ";
}

 

 

 

 

 

 

 

 

 

算法导论 2-1 在归并排序中引入插入排序 (在归并排序中对小数组采用插入排序)虽然归并排序的最坏情况运行时间为θ(nlgn),而插入排序的最坏运行时间为θ(),但是插入排序中的常量因子可能使得它在n较小时,在许多机器上实际运行得更快。因此,在归并排序中当子问题变得足够小时,采用插入排序来使递归的叶变粗是有意义的。考虑对归并排序的一种修改,其中使用插入排序来排序长度为k的n/k个子表,然后使用标准的合并机制来合并这些子表,这里k是一个待定的值。 a. 证明:插入排序最坏情况可以在θ(nk)时间内排序每个长度为k的n/k个子表。 b. 表明在最坏情 阅读详情

相关推荐

插入排序、归并排序、堆排序和快速排序的稳定性分析

在计算机科学中,排序是将一组数据按照特定顺序进行排列的过程。排序算法的效率和稳定性是评价其优劣的两个重要指标。稳定性指的是在排序过程中,相等的元素在排序后保持原有的相对顺序。本文将详细分析插入排序、归并排序、堆排序和快速排序这四种常见排序算法的稳定性,并通过浅显易懂的语言进行解释。

笔者从事电信媒体开发多年,愿意将多年的开发经验分享给同行 2865

PTA插入排序还是归并排序

根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。 归并排序进行如下迭代操作:首先将原始序列看成 N 个只包含 1 个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下 1 个有序的序列。 现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究...

Sinclair 3257

scGPT实战指南:如何用生成式AI加速你的单细胞多组学研究?

本文提供了scGPT在单细胞多组学研究中的实战指南。详细介绍了从环境部署、数据预处理到细胞类型注释与扰动预测等核心任务的操作流程。通过利用生成式AI和Transformer基础模型,scGPT能够显著加速分析,并提升细胞注释的准确性及基因调控网络推断的深度,为研究人员提供了强大的AI分析引擎。

weixin_29215815的博客 402

插入排序还是归并排序 pta

根据维基百科的定义:插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。归并排序进行如下迭代操作:首先将原始序列看成 N 个只包含 1 个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下 1 个有序的序列。现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法?输入在第一行给出正整数 N (≤100);随后一行给出原始序列的 N 个整数;最后一行给出由某排序算

wzx_442011334的博客 635

手把手教你用Anaconda安装李沐d2l-zh包(附常见报错解决方案)

本文提供了一份详尽的Anaconda环境下安装李沐d2l-zh包的实战指南。文章从创建虚拟环境、配置国内镜像源加速下载入手,分步讲解核心依赖的预安装策略,并重点剖析了安装过程中常见的报错及其解决方法,旨在帮助初学者和开发者高效、稳定地搭建深度学习实验环境。

efc1234567的博客 1010

光模块数字诊断监控(DDM)功能

DDM(Digital Diagnostic Monitoring)数字诊断监控,由行业组织SFF Committee制定,遵循SFF-8472多源协议定义的标准参数而工作,规范了光模块和网络设备的软硬件所需遵循的标准数值或范围,确保了网络设备供应商和光模块供应商之间所提供产品的互操作性不同。:通过监测激光器的偏置电流来预测激光器的劣化,从而确保在故障发生之前将业务切换到备用链路上或替换有可能故障的光模块,因此起到了预测光模块寿命的作用。光模块DDM信息可以通过SNMP读取光模块的接收光功率和发射光功率。.

光模块的博客 2300

PAT1035 插入与归并 (25 分)

题目描述 根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。 归并排序进行如下迭代操作:首先将原始序列看成 N 个只包含 1 个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下 1 个有序的序列。 现给定原始序列和由某排序算法产生的中间序列,请你判...

liuzuoping的博客 1646

Synopsys安装教程Ubuntu22.04版本

在Ubuntu22版本上安装Synopsys等系列工具,安装DC,VCS等等

qq_59529218的博客 5725

21级数据结构与算法实验8——排序

每次只能合并相邻的两堆,合并的代价为这两堆石子的质量之和,合并后与这两堆石子相邻的石子将和新堆相邻,由于合并顺序的不同,导致合并成一堆石子的总代价也不同,请求出最少的代价将所有石子合并为一堆。进行如下迭代操作:首先将原始序列看成 N 个只包含 1 个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下 1 个有序的序列。题目保证每组测试的结果是唯一的。

m0_63485942的博客 4699

使用Termux在Android设备上编译运行SpecCPU2006

SPEC2006搭配Termux,竟然还能这么玩?!

菜菜的菜园子 2960

Loki 分布式日志中心服务

分布式日志中心 Loki + Promtail + Grafana

原名又逢乱世。不要放下学习的脚步,毕竟比天天打牌、钓鱼、打游戏更能从内在充实自己。 2353

插入排序与归并排序

浅谈插入排序与归并排序关于排序似乎从大一开始学习变成就开始在使用各种排序方法了,今天看了下有关于插入排序和归并排序的内容,并且对应在 LeetCode 上面做了两道测试题,因此就对插入排序和归并排序做一个简单的小结吧,就当做是我的学习笔记,大佬请勿嘲笑! 插入排序 归并排序 插入排序 关于插入排序主要的思想就是从左到右的遍历一个序列,有一个标识来标记,保证左边的序列有序,再往右遍历的过程中将序列

GorMing 的博客 1224

AUTOSAR MCAL开发及EB Tresos工具使用总结

在基于AutoSar CP架构开发MCAL时,会使用到EB tresos工具。本文主要对MCAL开发及EB tresos工具使用进行总结,仅作为自学使用,以方便后续查漏补缺。

liuxu324的博客 2626

在归并排序中对小数组采用插入排序

摘要: 使递归的叶子变粗【对算法,数学,计算机感兴趣的同学,欢迎关注我哈,阅读更多原创文章】在文章中,我们了解了分治算法的设计和分析方法,并且得出了归并排序算法的最坏情况运行时间为Θnlogn。在文章中,我们了解了算法分析的方法论,并且以插入排序为例,得到了插入排序最坏情况运行时间为Θn2。虽然开起来好像归并排序比插入排序的运行时间要好,但插入排序中的常量因子可能使得它在 n 较小时,在许多机器上实际运行得更快。因此归并排序中,当子问题规模足够小时,采用插入排序。

计算机、人工智能、算法和数学 963

069、自动曝光(AE)测光策略:全局/中心/点测光与曝光时间增益分配

本文深入探讨了自动曝光(AE)测光策略的技术细节与实际应用。作者通过多个真实案例(手机前置摄像头、车载ADAS、安防监控等)分析了全局测光、中心测光和点测光的优缺点,指出不同场景应采用不同策略。重点剖析了曝光时间与增益分配的"跷跷板效应",提出要根据传感器特性选择最优分配方案。文章强调测光策略应动态调整,并给出5条实用建议:结合场景切换测光模式、关注传感器增益拐点、点测光需防抖处理、全局测光不宜迷信、调试要观察亮度直方图。最后指出AE调试需要结合具体硬件特性进行实测优化,没有通用解决方案。

zzfmlxs的博客 101

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

疯狂的Java算法——插入排序,归并排序以及并行归并排序

从古至今的难题      在IT届有一道百算不厌其烦的题,俗称排序。不管是你参加BAT等高端笔试,亦或是藏匿于街头小巷的草根笔试,都会经常见到这样一道百年难得一解的问题。   今天LZ有幸与各位分享一下算法届的草根明星,排序届的领衔大神——插入排序以及归并排序。最后,在头脑风暴下,LZ又有幸认识了一位新朋友,名叫并行归并排序。接下来,咱们就一一认识一下,并且在最后来一次“算林大会”吧。  

Java's paradise 1239

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

插入排序与归并排序及优化

看CLRS顺便做下笔记总结一下,理清思路。(所有排序例子皆为从小到大,各位觉得哪里能更好地改进都可以指出来)插入排序(c语言实现)最坏情况下的运行时间是Θ(n*n),跟冒泡排序,选择排序的最坏情况下的运行时间是相同的但是,运算的速度 插入>选择(相比冒泡交换的次数较少)>冒泡最简单的例子啦,打牌的时候一张一张的拿到手里插入排序。上代码#include<stdio.h> #include<std

日复一日,年复一年 1284

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【排序】归并排序利用插入排序优化

归并排序利用插入排序优化 对于归并排序的优化,除了采用一次性内存分配策略外,还可以对小规模数组采用插入排序以提高效率。 相比较而言,插入排序的原地、迭代实现的性质使得其对于小规模数组的排序更具优势。那么,一个值得思考的问题是,当子问题规模为多大时,适合采用插入排序? 考虑一个理想化的模型:有n/k个具有k个元素的列表,我们需要对每个列表采用插入排序,再利用标准合并过程完成整个排序。那

wu_yihao的专栏 2977

插入排序、归并排序以及小和问题

一.插入排序 插入排序的思想了类似于向一个有序的数组里面插入一个数。最初我们将一个无序的数组0~N-1的0~0部分视作有序,然后取1位置的数与0位置上的数进行比较,比0位置上数小就进行交换,比0位置上数大就不变,从而使0~1部分排成有序,以此类推。也就是说,取有序部分后边的数插入到那个有序的部分,将这个数和它前面的数依次进行比较,比前面的数小就进行交换,比前面的数大就已经找到了这个数的位置,直到...

sdr_zd的博客 2044

插入排序和归并排序

插入paiu

在路上 1658

插入排序和归并排序算法的实现和优化

插入排序算法是专门对于数组进行排序的一种算法。可以将无序的数组转化成为有序的状态。可以说插入排序算法是我们排序算法当中最简单的算法之一。其主要进行的操作和我们打扑克当中抓拍的思路很相同。我们只需要保证我们最开始的数组为有序状态,拿到一个新的数据的时候就可以将该数据从最右边开始向左进行判断我们新数据想要插入的位置。如果小于我们最右边的数据就进行交换操作。直到第一次数据大于左侧的数据即可。实际过程如下图所示:但是我们可能有的同学会想:要是前面的元素不有序呢?这样不是使用起来很局限吗?

lmbuhuiku的博客 775
上一篇: delete和delete[]
下一篇: 名人堂与代金券
ZanLanguage
博客等级 码龄7年 2粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值