归并排序(使用分治思想实现)

文章目录

前言

一、什么是分治思想?

二、如何使用分治思想实现归并排序?

1.设计归并排序的步骤

2.归并排序代码实现

总结


前言

简要记录一下自己的学习算法的思路吧!


一、什么是分治思想?

在介绍归并排序前,我们先来了解一下实现归并排序的中心思想。分治思想简单来说就是,将原来的大规模问题分解成n个小规模的子问题,然后分别对这n个问题进行求解。这n个问题可以具有相同求解操作,也可以是相互独立的子问题。(具体的分治思想,看其他有关的解释,这里只作简单介绍。)


二、如何使用分治思想实现归并排序?

1.设计归并排序的步骤

  1.  分解。将一段无序序列进行分解,对于分解后的每一个部分继续分解直到问题足够简单。也就是说,将序列不断的分为两部分(使用递归)直到每一个小序列(分解后的每一个小部分)都只有一个数,因为一个数作为一个序列必定有序,所以该情况为最简问题。
  2. 合并。经过分解后每一段序列必定有序,所以只需要合并就好了。但是合并两个有序序列时,需要对两个序列的数字进行比较,判断优先入列的元素。

具体操作如下:

                

2.归并排序代码实现

代码如下:

/*
归并排序
*/
#include<iostream>
using namespace std;
const int N = 1005;

void Meger(int* a, int l, int mid, int r)
{
    int b[N];
    int i = l, j = mid + 1, t = 0;
    //对两个序列的数字一一比较,大的先入序列b(暂时序列)
    while (i <= mid && j <= r)
    {
        if (a[i] > a[j])b[t++] = a[j++];    //小的先入队列b
        else b[t++] = a[i++];        //默认为前半段队列先入
    }
    //将未完全入队列的全部放入
    while (i <= mid)b[t++] = a[i++];
    while (j <= r)b[t++] = a[j++];
    //将排好序的数放回原数组
    for (int i = 0; i < t; i++)a[i + l] = b[i];
}

void Megersort(int* a, int l, int r)
{
    if (l < r)        //如果序列仅有一个数就不需要分
    {
        //将数组分为各个有序序列
        int mid = (l + r) >> 1;
        Megersort(a, l, mid);
        Megersort(a, mid + 1, r);
        //合并
        Meger(a, l, mid, r);
    }
}

int main()
{
    //创建一个数组
    int arr[11] = { 7, 3, 6, 2, 4, 1, 5, 5, 9, 10, 1 };
    //排序
    Megersort(arr, 0, sizeof(arr) / sizeof(int) - 1);
    //输出
    for (int i = 0; i < sizeof(arr) / sizeof(int); i++)
    {
        cout << arr[i] << " ";
    }
    cout << endl;
}

总结

第一次写博客,写的不是很好,希望看见这篇文章的大佬们能够慷慨的给予一些意见。

之所以尝试写博客,是因为听从师兄的建议尝试通过这种方式来加强自己的理解和记忆。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值