Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >归并排序

归并排序

作者头像
用户8224910
发布于 2022-05-10 01:40:58
发布于 2022-05-10 01:40:58
23900
代码可运行
举报
文章被收录于专栏:个人学习总结个人学习总结
运行总次数:0
代码可运行

归并排序

归并排序是排序算法中的一种,采用了分治的思想,将一组数先划分为n组,每组至少有一个数,再将这n组两组两组进行归并排序(有递归的成分),最终即可得到排好序的一组数。

问题 : 实现链表(线性表)

题目描述 (线性表)顺序结构线性表LA与LB的结点关键字为整数。LA与LB的元素按非递减有序,线性表空间足够大。试用给出一种高效算法,将LB中元素合到LA中,使新的LA的元素仍保持非递减有序。高效指最大限度的避免移动元素。 输入 输入LA长度m:7 输入数据:3 7 11 15 57 68 99 输入LB长度n:7 输入数据:6 7 8 9 10 23 67 输出 3 6 7 8 9 10 11 15 23 57 67 68 99

样例输入

7 4 6 7 9 10 16 23 8 1 2 4 7 8 13 15 44

样例输出

1 2 4 6 7 8 9 10 13 15 16 23 44

这是一个不太恰当的例子,虽然是链表的题目,但与链表的操作没有直接关系,反而是用到了归并排序的思想。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<iostream>
using namespace std;
int main()
{
    int m,n,i,j=0;
    int a[300],b[300],c[600];
    cin>>m;
    for(i=0;i<m;i++)
    {
        cin>>a[i];
    }
    cin>>n;
    for(i=0;i<n;i++)
    {
        cin>>b[i];
    }
    int k=0,count=0;
    i=0;
    while(i<m && j<n)  //两组数归并排序
    {
        if(a[i]<b[j])     
        {
            c[k++]=a[i++];
        }
        else if(b[j]<a[i])
        {
            c[k++]=b[j++];
        }
        else
        {
            c[k++]=a[i++];  //根据题目要求,注意相等的情况,只将一个数写入新数组即可
            j++;
        }
        count++;
    }
    while(i<m)
    {
        c[k++]=a[i++];
        count++;
    }
    while(j<n)
    {
        c[k++]=b[j++];
        count++;
    }
    for(i=0;i<count;i++)
    {
        cout<<c[i]<<" ";
    }
    cout<<endl;
    return 0;
} 
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-04-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
小白也能看懂的归并排序!!!
1.前言 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。 #include<iostream> using namespace std; #include<algorithm> //合并两个有序数组 void MemeryA
大忽悠爱学习
2021/11/15
2640
浅谈归并排序:合并 K 个升序链表的归并解法
在面试中遇到了这道题:如何实现多个升序链表的合并。这是 LeetCode 上的一道原题,题目具体如下:
归思君
2023/10/16
2110
浅谈归并排序:合并 K 个升序链表的归并解法
归并排序
将两个或两个以上有序的数列(或有序表),合并成一个仍然有序的数列(有序表),这种操作称为归并操作。这样的方法经常用于多个有序的数据文件归并成一个有序的数据文件。若将两个有序表合并成一个有序表则称为二路归并,同理,有三路归并、四路归并等。二路归并比较简单,所以我们只讨论二路归并。例如有两个有序表: (7,10,13,15)和(4,8,19,20),归并后得到的有序表为: (4,7,8,10,13,15,19,20)。         归并过程为:比较A[i]和A[j]的大小,若A[i]≤A[j],则将第一个有
attack
2018/04/12
6420
Carson带你学数据结构:归并排序,稳定性最高的排序算法
Carson带你学数据结构系列文章: Carson带你学数据:线性表-数组、链表 Carson带你学数据:特殊的线性表-栈、队列 Carson带你学数据:串 Carson带你学数据:树 Carson带你学数据:二叉树 Carson带你学数据:图 Carson带你学数据:查找
Carson.Ho
2021/12/06
2420
Carson带你学数据结构:归并排序,稳定性最高的排序算法
第十三天、归并排序
Jack_Cui
2017/12/28
5100
第十三天、归并排序
归并排序
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。 //将有序数组a[]和b[]合并到c[]中 void MemeryArray(int a[], int n, int b[], int m, int c[]) {
lwen
2018/04/17
4640
数据结构 严慰敏(C语言版第2版)【习题答案】
1.简述下列概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型。
MIKE笔记
2023/03/22
1.9K0
数据结构 严慰敏(C语言版第2版)【习题答案】
归并排序
归并排序是采用分治法的典型应用,而且是一种稳定的排序方式,不过需要使用到额外的空间。
Li_XiaoJin
2022/06/10
2890
归并排序
用归并排序求逆序对数(包括归并排序算法实现及代码)
那么我们很容易想到这个题有一种O(n*n)的暴力解法,但这不是我们所需要的,所以,要想归并排序来实现求逆序对数,那么首先我们要了解并掌握归并排序算法。
杨鹏伟
2020/09/11
1.1K0
排序----归并排序
上一篇:希尔排序 归并排序的特点: (优点):能够保证将任意长度为N的数组排序所需时间和NlogN成正比。 (缺点):所需额外空间与N成正比。 归并排序是算法设计中分治思想的典型应用。 原地归并方法: public static void merge(Comparable[] a,int lo,int mid,int hi){ //原地归并方法 int i=lo,j=mid+1; for(int k =lo;k<=hi;k++)//将a[]复制到aux[] aux[k] = a[k]; for(
SuperHeroes
2018/05/30
7090
基础算法篇——归并排序
基础算法篇——归并排序 本次我们介绍基础算法中的快速排序,我们会从下面几个角度来介绍快速排序: 归并排序思想 归并排序代码 归并排序拓展 归并排序思想 我们首先来介绍归并排序思想(分治思想): 确定分界点 我们首先确定整个数组的分界点 以我们的习惯而言还是以arr[l],arr[r],arr[(r+l)/2]为分界点 递归排序 我们首先需要将数组分界点两侧进行分组,这时他们会划分为左侧和右侧 我们再对已经划分的左侧和右侧进行分界点分组,这时就会划分为4个分组 依次类推,直到每个分组数为1时结束分组,然后我们
秋落雨微凉
2022/11/14
2770
【算法】归并排序
归并排序 当两组数据已经有序,我们可以通过以下方式让两组数据快速排序。 依次从两组数据中取前面最小的元素放到新的数组中,然后再把新数组中有序的数据拷贝到原数组,完成排序。这就是归并思想。 代码实现 #include<iostream> using namespace std; void mergeAdd(int* arr,int left,int mid,int right) { int temp[64] = { 0 }; int i = left;//指向左边数组最小的元素位置
半生瓜的blog
2023/05/13
2390
【算法】归并排序
前端学习数据结构与算法系列(七):堆排序与归并排序
堆排序 前言 堆排序相比冒泡排序、选择排序、插入排序而言,排序效率是最高的,本文从堆的属性和特点出发采用图文形式进行讲解并用JavaScript将其实现,欢迎各位感兴趣的开发者阅读本文? 堆属性 堆分
一只图雀
2020/05/21
9030
图解:「归并排序」
今天小浩给大家分享一篇关于归并排序的文章。考察归并排序的题目可以形态各异,但是万变不离其宗,希望看完今日之章,你能掌握归并排序及其思想大成。
程序员小浩
2020/10/26
8500
图解:「归并排序」
数据结构 重点详解
该文是关于计算机基础知识的总结,包括基础概念、算法、数据结构等方面。文章还介绍了几个常见的高级技术,如链表、动态规划、分治、贪心算法等。通过这些内容,读者可以更好地理解计算机科学的基础知识,掌握计算机科学的核心思想和方法,并能够应用到实际问题中。
Kindear
2018/01/03
1.6K0
数据结构  重点详解
归并排序[从入门到放弃]
归并排序,是创建在归并操作上的一种有效的排序算法,效率为O(nlogn)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列,归并排序的比较次数小于快速排序的比较次数,移动次数一般多于快速排序的移动次数。
233333
2019/11/02
1K0
基础算法 | 最终章-8 归并排序
我们已经在本系列文章中已经学习了7种算法,其中一种是查找算法,六种是排序算法。本篇文章是基础算法系列的最后一章,我们将学习最后一个排序算法——归并排序。让我们话不多说,开始学习吧~
ACM算法日常
2018/12/06
4270
DS内排—2-路归并排序
对每组测试数据,输出2-路归并排序的每一趟排序结果。每组测试数据的输出之间有1空行。
叶茂林
2023/07/30
2070
归并排序及其并行化
归并排序是分治法(Divide and Conquer)的一个典型的应用,属于比较类非线性时间排序。比较类排序中性能最佳,应用广泛。
恋喵大鲤鱼
2022/11/29
7560
归并排序及其并行化
C#归并排序算法
归并排序(Merge Sort)是一种高效的排序算法,采用分治法(Divide and Conquer)的一个典型应用。这个算法在1945年由John von Neumann首次提出。与其它排序算法,如快速排序不同,归并排序无论在最好、最坏还是平均情况下,时间复杂度都是O(n log n),这使得它在大数据集上非常有效。归并排序是建立在归并操作上的一种稳定的排序算法,该算法将已有序的子序列合并,得到完全有序的序列。
Michel_Rolle
2024/10/10
2.5K0
相关推荐
小白也能看懂的归并排序!!!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验