0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

排序算法之归并排序讲解

学益得智能硬件 来源:学益得智能硬件 2023-03-06 11:32 次阅读

今天我们继续来讲排序算法,归并排序,难度一般,但是效率也还不错。

老规矩,先搞清楚原理,再写代码。

归并排序分为两个步骤,先是拆分,然后再合并。

我们先来看下合并。

假设有两个有序的数组,一个是1、3、5,一个是2、4、6、8,把他们合并成一个有序的数组。

39d04f70-bbcc-11ed-bfe3-dac502259ad0.png  

这个操作应该极其简单。两个下标,一块新的内存。

1和2比较,1小,把1放在新的内存中,x向后走。

2和3比较,2小,把2放在内存中,y向后走。

下面依次把4和5放进去,最后x达到了末尾,y变成了6的下标,那就把y后面的数据全部放进去就行。

这个过程就是合并。

那么问题又来了,去哪找两个有序的数组。

这个就需要对数组做拆分。

3a1b5560-bbcc-11ed-bfe3-dac502259ad0.png  

比如数组有8个元素,我们先从中间拆开,得到两个数组,每个4个元素。

但是这两个数组也不是有序的,于是对两个数组继续拆分。

左边是两个数组,每个数组两个元素,右边也一样。

这样还不够,继续拆分,最后得到的数组只有一个元素。

如果一个数组只有一个元素,那么它一定就是有序的。

这个过程就需要用到递归。

过程清楚了,下面就是用代码来实现它。

#include 
#include 
#include 


#define SIZE     100000


void merge(int *a, int start, int mid, int end)
{
    int left_len = mid - start + 1;
    int right_len = end - mid;


    int *L = (int *)malloc(sizeof(int) * left_len);
    int *R = (int *)malloc(sizeof(int) * right_len);


    int i, k = start, j;
    for (i = 0; i < left_len; i++, k++)
    {
        L[i] = a[k];
    }


    for (i = 0; i < right_len; i++, k++)
    {
        R[i] = a[k];
    }


    for (i = 0, j = 0, k = start; i < left_len && j < right_len; k++)
    {
        if (L[i] > R[j])
        {
            a[k] = R[j++];
        }
        else
        {
            a[k] = L[i++];
        }
    }


    if (i < left_len)
    {
        for (; i < left_len; i++, k++)
        {
            a[k] = L[i];
        }
    }


    if (j < right_len)
    {
        for (; j < right_len; j++, k++)
        {
            a[k] = R[j];
        }
    }


    free(L);
    free(R);
}


void merge_sort(int *a, int start, int end)
{
    if (start >= end)
        return;


    int mid = (end + start) / 2;


    merge_sort(a, start, mid);
    merge_sort(a, mid + 1, end);


    merge(a, start, mid, end);
}


int main()
{
    int num, arr[SIZE] = {0}, i;


    //随机产生数组
    srand(time(NULL));
    for (i = 0; i < SIZE; i++)
    {
        arr[i] = rand() % 100;
    }


    merge_sort(arr, 0, SIZE - 1);


    for (i = 0; i < SIZE; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("
");


    return 0;
}
归并排序难度不大,但是和堆排序一样,数据越多,顺序越乱,效率越高。

当然,归并排序的缺点就是,需要更多的内存空间。




审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • MID
    MID
    +关注

    关注

    1

    文章

    27

    浏览量

    11397
  • printf函数
    +关注

    关注

    0

    文章

    30

    浏览量

    5827

原文标题:排序算法之归并排序

文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    FPGA排序-冒泡排序介绍

    排序算法是图像处理中经常使用一种算法,常见的排序算法有插入排序、希尔
    发表于 07-17 10:12 675次阅读
    FPGA<b class='flag-5'>排序</b>-冒泡<b class='flag-5'>排序</b>介绍

    十大排序算法总结

    排序算法是最经典的算法知识。因为其实现代码短,应该广,在面试中经常会问到排序算法及其相关的问题。一般在面试中最常考的是快速
    的头像 发表于 12-20 10:39 721次阅读

    嵌入式stm32实用的排序算法 - 交换排序

    :插入排序、选择排序、交换排序归并排序、基数排序排序的分类大致为如下图:在内部
    发表于 04-12 13:14

    各种排序算法的时间空间复杂度、稳定性

    各种排序算法的时间空间复杂度、稳定性一、排序算法分类:二、排序算法比较:注:1、
    发表于 12-21 07:48

    介绍几种常用的排序算法C实现

    文章目录1、冒泡排序法2、选择排序3、插入排序4、快速排序(快排)5、归并排序1、冒泡排序
    发表于 12-21 06:31

    C语言教程之归并排序

    C语言教程之归并排序,很好的C语言资料,快来学习吧。
    发表于 04-22 11:06 0次下载

    C语言教程之几种排序算法

    数据结构的排序算法有很多种。 其中, 快速排序 、希尔排序、堆排序、直接选择排序不是稳定的
    发表于 11-16 10:23 1626次阅读

    常用排序算法分析

    一种是比较排序,时间复杂度O(nlogn) ~ O(n^2),主要有:冒泡排序,选择排序,插入排序归并排序,堆
    的头像 发表于 07-13 16:13 1970次阅读

    排序算法分享:归并排序说明

    我们今天继续给大家分享排序算法里面的另外一种排序算法归并排序
    的头像 发表于 12-24 14:34 602次阅读

    如何去实现并验证一种归并排序

    归并排序的核心思想是:利用分治策略,不断划分子序列直到不能划分为止,此时各个子序列是有序的,合并相邻有序子序列最终得到一个有序序列。
    的头像 发表于 06-23 14:29 1246次阅读
    如何去实现并验证一种<b class='flag-5'>归并排序</b>?

    C++基础语法十大排序算法后五个分享

    本期是C++基础语法分享的第十六节,今天给大家来梳理一下十大排序算法后五个! 归并排序 归并排序:把数据分为两段,从两段中逐个选最小的元素移入新数据段的末尾。可从上到下或从下到上
    的头像 发表于 10-08 15:06 1103次阅读
    C++基础语法十大<b class='flag-5'>排序</b><b class='flag-5'>算法</b>后五个分享

    随机数字排序教程

    本次实验我们利用对随机数字进行排序来给大家介绍排序算法的实现,常见的快速排序归并排序、堆排序
    的头像 发表于 03-24 14:55 722次阅读
    随机数字<b class='flag-5'>排序</b>教程

    排序算法之“归并算法”介绍

    在说这个题目之前先来说说一个排序算法归并算法归并算法采取思想是分治思想,分治思想简单说就
    的头像 发表于 05-22 10:03 430次阅读
    <b class='flag-5'>排序</b><b class='flag-5'>算法</b>之“<b class='flag-5'>归并</b><b class='flag-5'>算法</b>”介绍

    排序算法有哪些

    1. 归并排序(递归版) 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治策略,即分为两步:分与治。 分
    的头像 发表于 10-11 15:49 326次阅读
    <b class='flag-5'>排序</b><b class='flag-5'>算法</b>有哪些

    时间复杂度为O (nlogn)的排序算法简述

    归并排序遵循分治的思想:将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后合并这些子问题的解来建立原问题的解。
    的头像 发表于 12-05 09:57 297次阅读
    时间复杂度为O (nlogn)的<b class='flag-5'>排序</b><b class='flag-5'>算法</b>简述