小白学算法2.5——归并排序(自顶而下)

本文详细介绍了归并排序的原理和实现,包括其分治思想、时间复杂度分析以及自顶而下的递归实现。归并排序具有O(nlogn)的时间复杂度,但空间复杂度为O(n),限制了其广泛应用。文章还提到通过插入排序优化小规模子数组,以提升排序速度。
摘要由CSDN通过智能技术生成

小白学算法2.5——归并排序(自顶而下)

标签: 小白学算法


1.归并排序算法

归并排序属于高级排序,时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn),空间复杂度为 O ( n ) O(n) O(n)。归并排序的优点是其时间复杂度较低,任意数列的排序时间都和nlogn成正比;归并排序的缺点是其空间复杂度较高,为 O ( n ) O(n) O(n)

归并排序采用的是分治思想。分治的指的是把大事情分解为小事情;分治的指的是把分解的小事情各个击破,以达到击破大事情。假设有一种方法A能够将两个有序数组有序的合并到新的数组中。现在有一待排序的数组,我们将其一分为二,二分为四……最终会把这个数组分离成若干个只有一个元素的数组(只有一个元素的数组是有序数组)。这个时候调用方法A,先把相邻的一元素数组合并成二元素数组,再调用方法A,把相邻的二元素数组合并为四元素数组……最终就可以得到原来数组有序化以后的数组。

2.自顶而下的归并排序实现

归并的英文是merge,也是合并的意思,但是感觉翻译成归并更合适。归并归并,递归分解再合并,所以递归分解至少需要两个函数来实现,一个用来递归分解,一个用来合并。

如果用C语言来实现的话,要么用全局变量来开辟消耗的空间,要么在递归的函数里面开辟消耗的空间,然后把开辟数组的首元素也作为函数的参数传递给合并函数,不过这么写起来麻烦,为了逻辑上更清楚一些,笔者将使用C++类来实现归并排序。

#include "stdafx.h"
#include <STDIO.H>

class MergeSort
{
   
public:
    void sort(int* a, int n);//用户调用排序
	
private:
    void mergeSort(int* a, int lo, int hi);//递归
    void merge(int* a, int lo, int mid, int hi);//合并
    
    int* 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值