C++ 归并排序(merge sort)案例详解

 更新时间:2021年08月24日 14:22:25   作者:Joe_Somebody  
这篇文章主要介绍了C++ 归并排序(merge sort)案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

核心思想:“分”与“合”。

主体流程

先将一个序列分成很多个不能再分割的子序列,将各个子序列分别排序后再将子序列合并。其实就是重复两个步骤:【1】分【2】合并。
首先是第一个小问题,怎么分?
比如说一个序列:12 ,23,1,44,233,10,9,8。我们先分成两段:12 ,23,1,44 和 233,10,9,8,
发现还能再分成4段:12 ,23 和 1,44------233,10 和 9,8。
再分成8段:12--23--1--44 和233--10--9--8。
这时候开始把子序列进行排序合并,一个元素就是有序的。所以不用排序。
合并成2个一组排序得到:12,23----1,44---10,233---8,9。
再合并成4个一组排序得到:1,12,23,44---8,9,10,233。
最后合并得到最终结果:1,8,9,10,12,23,44,233。

下面是分段的代码,用递归实现。

void mergesort(int a[], int first, int last, int temp[])  
{  
    if (first < last)  
    {  
        int mid = (first + last) / 2;  
        mergesort(a, first, mid, temp);    //左边有序  
        mergesort(a, mid + 1, last, temp); //右边有序  
        mergearray(a, first, mid, last, temp); //再将二个有序数列合并  
    }  
}

整体思路很清晰,还差一个小问题没解决,怎么合并?
现在问题就变成了怎么合并两个有序序列,思路是比较两个有序序列的第一个元素,谁小把谁放进最终序列的结尾,并把它从原来的队列里面删掉直到有个序列为空。
这时候另一个序列可能还有剩余的数据。没关系,因为他们本身是有序的,所以我们只要按顺序把他们添加到最终序列的尾部就好了。
这样两个有序序列就合并成一个有序序列了。
实现代码:

void mergearray(int a[], int first, int mid, int last, int temp[])  
{  
    int i = first, j = mid + 1;  
    int m = mid,   n = last;  
    int k = 0;  
      
    while (i <= m && j <= n)  
    {  
        if (a[i] <= a[j])  
            temp[k++] = a[i++];  
        else  
            temp[k++] = a[j++];  
    }  
  
    while (i <= m)  
        temp[k++] = a[i++];  
  
    while (j <= n)  
        temp[k++] = a[j++];
}

整体测试代码:

#include<iostream>  
#include<math.h>  
#include<stdlib.h>  
using namespace std;  
  
//将有二个有序数列a[first...mid]和a[mid...last]合并。  
void mergearray(int a[], int first, int mid, int last, int temp[])  
{  
    int i = first, j = mid + 1;  
    int m = mid,   n = last;  
    int k = 0;  
      
    while (i <= m && j <= n)  
    {  
        if (a[i] <= a[j])  
            temp[k++] = a[i++];  
        else  
            temp[k++] = a[j++];  
    }  
      
    while (i <= m)  
        temp[k++] = a[i++];  
      
    while (j <= n)  
        temp[k++] = a[j++];  
      
    for (i = 0; i < k; i++)  
        a[first + i] = temp[i];  
}  
void mergesort(int a[], int first, int last, int temp[])  
{  
    if (first < last)  
    {  
        int mid = (first + last) / 2;  
        mergesort(a, first, mid, temp);    //左边有序  
        mergesort(a, mid + 1, last, temp); //右边有序  
        mergearray(a, first, mid, last, temp); //再将二个有序数列合并  
    }  
}  
  
bool MergeSort(int a[], int n)  
{  
    int *p = new int[n];  
    if (p == NULL)  
        return false;  
    mergesort(a, 0, n - 1, p);  
    delete[] p;  //删除p临时数组
    return true;  
}  
  
int main()  
{  
    int i=0,temp=0;  
    int a[10]={0};  
    for(i=0;i<10;i++)  
{  
  
 a[i]=rand();  
 cout<<a[i]<<" ";  
  
}  
cout<<endl;  
MergeSort(a,10);  
for(i=0;i<10;i++) 
{  
    
    cout<<a[i]<<" ";  
  
}  
return 0;  
 }  

到此这篇关于C++ 归并排序(merge sort)案例详解的文章就介绍到这了,更多相关C++ 归并排序(merge sort)内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java日常练习题,每天进步一点点(5)

    Java日常练习题,每天进步一点点(5)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-07-07
  • mybatis-plus 分页类型转换工具类

    mybatis-plus 分页类型转换工具类

    用mybatis-plus 的分页对象的时候,因为用mybatis-puls 查询出来的分页对象的records里的泛型是实体,有时候需要将实体转换为前端展示的对象,所有写了一个分页数据的类型转换工具,解决这个问题,对mybatis-plus 分页工具类相关知识感兴趣的朋友一起看看吧
    2022-03-03
  • Java中Minio的基本使用详解

    Java中Minio的基本使用详解

    这篇文章主要介绍了Java中Minio的基本使用详解,MinIO 是一个基于Apache License v2.0开源协议的对象存储服务,它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,需要的朋友可以参考下
    2024-01-01
  • Java SpringBoot在RequestBody中高效的使用枚举参数原理案例详解

    Java SpringBoot在RequestBody中高效的使用枚举参数原理案例详解

    这篇文章主要介绍了Java SpringBoot在RequestBody中高效的使用枚举参数原理案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • 深入解析Jdk8中Stream流的使用让你脱离for循环

    深入解析Jdk8中Stream流的使用让你脱离for循环

    这篇文章主要介绍了Jdk8中Stream流的使用,让你脱离for循环,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • SpringCloud Gateway实现限流功能详解

    SpringCloud Gateway实现限流功能详解

    SpringCloud Gateway 是 Spring Cloud 的一个全新项目,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。这篇文章主要介绍了SpringCloud Gateway实现限流,需要的朋友可以参考下
    2022-11-11
  • RocketMQ普通消息实战演练详解

    RocketMQ普通消息实战演练详解

    这篇文章主要为大家介绍了RocketMQ普通消息实战演练详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Java使用组合模式实现表示公司组织结构功能示例

    Java使用组合模式实现表示公司组织结构功能示例

    这篇文章主要介绍了Java使用组合模式实现表示公司组织结构功能,简单描述了组合模式的概念、功能并结合实例形式分析了Java使用组合模式实现公司组织结构表示功能具体操作步骤与相关注意事项,需要的朋友可以参考下
    2018-05-05
  • mybatis中mapper.xml文件的常用属性及标签讲解

    mybatis中mapper.xml文件的常用属性及标签讲解

    这篇文章主要介绍了mybatis中mapper.xml文件的常用属性及标签讲解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java中volatile关键字的作用

    Java中volatile关键字的作用

    这篇文章主要介绍了Java中volatile关键字的作用,文章基于Java的相关资料展开对volatile关键字作用的详细介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-04-04

最新评论