小白学算法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*