IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C/C++语言100题练习计划 89——归并排序(分治法实现) -> 正文阅读

[C++知识库]C/C++语言100题练习计划 89——归并排序(分治法实现)

名人说:博学之,审问之,慎思之,明辨之,笃行之。——《中庸》
进度:C/C++语言100题练习计划专栏,目前89/100

🥇C/C++语言100题练习专栏计划目的:巩固练习C/C++语言,增强上机、动手实践能力,交流学习!

一、问题呈现

1.问题描述

Problem Description

输入一个含有n个元素的数列,输出归并排序后的结果。(升序输出)

2.输入输出

Input

第一行:一个整数n,表示数列中元素的个数。(0< n <=1000)
第二行:n个数列元素。

Output
第一行:输出排序后的数列

3.测试样例

Sample Input

8
42 15 20 6 8 38 50 12

Sample Output

6 8 12 15 20 38 42 50

二、源码实现

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;

//归并(合并)函数
void Merge(int a[],int low,int mid,int high)
{
    int *b=new int [high-low+1];//申请一个跟数组a同大小的辅助数组
    int i=low; //将i指向第一分段的最左边元素
    int j=mid+1; //将j指向第二分段的最左边元素
    int k=0; //k指向辅助数组首元素下标
    
    while(i<=mid && j<=high)//将数组a中的元素按从小到大的顺序存放到辅助数组b中
    {
        if(a[i]<=a[j])
        {
            b[k++]=a[i++];
        }
        else
        {
            b[k++]=a[j++];
        }
    }

 	//这两个while是处理数组a剩下的元素,因为分段之后数组大小未必一样大。   
 	//并通过这两个while循环将其复制到B数组中去。 
    while(i<=mid)
    	b[k++]=a[i++];

    while(j<=high)
        b[k++]=a[j++];
    
    //此时数组b中是排好序的元素序列,将其所有元素复制到数组a中
	for(i=low,k=0;i<=high;i++)
    {
        a[i]=b[k++];
    }
    
    //使用完数组b之后,将其释放掉
    delete []b;
}

//归并(合并)排序
void MergeSort(int a[],int low,int high)
{
    if(low<high)
    {
        int middle=(low+high)/2;//取中点
        MergeSort(a,low,middle); //将第一段A[low:mid]进行合并排序(分治递归)
        MergeSort(a,middle+1,high); //将第二段A[mid+1:high]进行合并排序
        Merge(a,low,middle,high);//最终合并完成后复制到A辅助数组
    }
}

//主函数
int main()
{
	//对数组a以及变量n进行声明定义
    int a[1005];
    int n;
    
    //输入元素的个数n
    cin >> n;
	//输入数组序列中的元素
    for (int i=0;i<n;i++)
    {
        cin >> a[i];
    }
    
    //调用归并(合并)排序函数,对数组中序列元素进行排序
	MergeSort(a,0,n-1);
    
	//输出归并排序之后的结果(升序)
    for (int i=0;i<n;i++)
    {
        cout << a[i] << " " ;
    }
    
    //输出换行
	cout << endl;
    return 0;
}

★关于本题思路及归并排序

1、本题思路简述

题意输入一个含有n个元素的数列,输出归并排序后的结果。(要求:降序排序)
从问题描述来看,要使用归并排序进行排序,归并排序是采用分治法实现对n个元素进行排序的算法,是分治法的一个典型应用。可以大致分解出以下过程:
①分解
将待排序的元素分成大小大致相同的两个子序列。
②治理
将两个子序列进行归并排序(合并排序)。
③合并
将排序好的有序子序列进行合并,得到最终的有序序列。
在这三步操作之后会得到一个有序序列至于输出时是升序还是降序,可以通过调节循环条件的写法,来按要求输出,比如升序转降序可以将初始的循环条件i=0;i<n;i++可以改为i=n-1;i>=0;i–,降序转升序同理。(方法不一)。

2、归并排序

归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。

1??关于归并排序的理解
归并排序,大致思想其实就是先将数组中的元素拆分成若干小部分,然后再将这些小部分按照顺序进行重新归并,从而实现排序。根据分治法的思想(“分而治之”),即将一个大问题分成若干个相同的小问题,因为问题规模变小了,所以解决问题的难度也相应地会减小一些。其实可以试想一下,对一个拥有1000个元素的数组进行排序简单还是对一个只拥有1个元素的数组进行排序简单?答案很明显。

2??举例
例如:对42 15 20 6 8 38 50 12进行归并排序

在这里插入图片描述
gif动图演示?
在这里插入图片描述

三、测试结果

8
42 15 20 6 8 38 50 12
6 8 12 15 20 38 42 50

--------------------------------
Process exited after 1.857 seconds with return value 0
请按任意键继续. . .

Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder)
如果对大家有帮助的话,希望大家能多多点赞+关注!这样我动力会更足哦! ?( ′・?・` )比心

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-09-15 01:47:57  更:2022-09-15 01:48:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 16:01:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码