归并排序(附C++实现)

简介: 归并排序(附C++实现)

最近心血来潮,又想看一些常用算法的知识点,反正之前也写过一篇简单的算法整理,算是开了个头,但是就没有后续了,今天就来整一个归并排序吧,随心而更。。。


归并排序算法遵循分治法的思想,就是首先将一个问题进行分解,然后逐个对这些子问题进行递归排序,最后合并结果,每当排序的序列长度为1时,递归开始回落,此时长度为1的这些序列都是排好序的,然后我们进行比较合并就行。


下面我写了一个简单的C++的实现例子,这只是一个测试用例,代码的安全性肯定是不够高,目的只是用来说明一下归并排序的思路,对于初学者简单的理解还是没问题的。

#include"MergeSort.h"
void merge(int* OriginalArray, int start_index, int temp_index, int final_index)
{
  int left = temp_index - start_index + 1;//左边分支的数据个数
  int right = final_index - temp_index;//右边分支的数据个数
  int* left_array = nullptr;
  left_array = new int[left + 1];//此处应该用异常处理判断是否申请内存成功
  int* right_array = nullptr; 
  right_array = new int[right + 1];//此处应该用异常处理判断是否申请内存成功
  int i = 0;
  for (; i < left; ++i)
  {
    left_array[i] = OriginalArray[start_index + i];
  }
  int j = 0;
  for (; j < right; ++j)
  {
    right_array[j] = OriginalArray[temp_index + j + 1];
  }
  //max 用来控制比较,作用相当于一个标志,意味着某一个分支已经比较到最后一个元素
  left_array[left] = INT_MAX;
  right_array[right] = INT_MAX;
  i = 0;
  j = 0;
  for (int k = start_index; k <= final_index; ++k)
  {
    //此处会发生合并,分别进行比较,总共比较k次,复杂度O(k)
    if (left_array[i] <= right_array[j])
    {
      OriginalArray[k] = left_array[i];
      i = i + 1;
    }
    else
    {
      OriginalArray[k] = right_array[j];
      j = j + 1;
    }
  }
}
void mergesort(int* OriginalArray,int start_index,int final_index)
{
  if (start_index < final_index)
  {
    int temp = (start_index + final_index)/2;
    //开始递归
    mergesort(OriginalArray, start_index, temp);
    //关于传参temp + 1 如果start和final之间的差为1,则直接对两个数进行排序
    mergesort(OriginalArray, temp + 1, final_index);
    merge(OriginalArray, start_index, temp, final_index);
  }
}
int main()
{
  int OriginalNumber[] = { 4,1,5,2,7,3,8,6,0,9 };
  mergesort(OriginalNumber, 0, 9);
  for (auto i : OriginalNumber)
  {
    cout << i << endl;
  }
  return 0;
}

“流水不争先,争的是滔滔不绝”—《一点就到家》电影台词

参考书籍:算法导论(第三版)


目录
相关文章
|
定位技术 C++
C++实现俄罗斯方块(附代码)
C++实现俄罗斯方块(附代码)
C++实现俄罗斯方块(附代码)
|
机器学习/深度学习 C++
C++实现实现逆时针旋转矩阵
C++实现实现逆时针旋转矩阵
C++实现实现逆时针旋转矩阵
|
编译器 C++ 容器
【C++要笑着学】迭代器适配器 | 内嵌类型实现反向迭代器 | 迭代器萃取
上一章讲解 list 模拟实现时,我们简单的提到了反向迭代器,我们说反向迭代器其实就是对正向迭代器的一种封装 —— 适配器模式(配接器模式)。当时我们做的是简单的了解,本章我们就来探讨这一部分的知识。
162 1
【C++要笑着学】迭代器适配器 | 内嵌类型实现反向迭代器 | 迭代器萃取
|
算法 区块链 C++
【C++要笑着学】vector 核心框架接口的模拟实现 | 基于STL3.0版本的简化vector | 浅谈迭代器失效问题(二)
STL 的源代码整体考虑的东西比较多,还要考虑和其他地方的结合,因此整体的设计是比较复杂的。基于这一系列原因,我们会以简单的形式去实现其核心框架接口,方便去学习 vector。
125 1
【C++要笑着学】vector 核心框架接口的模拟实现 | 基于STL3.0版本的简化vector | 浅谈迭代器失效问题(二)
|
存储 C++
C++异常处理机制由浅入深, 以及函数调用汇编过程底层刨析. C++11智能指针底层模拟实现
C++异常处理机制由浅入深, 以及函数调用汇编过程底层刨析. C++11智能指针底层模拟实现
C++异常处理机制由浅入深, 以及函数调用汇编过程底层刨析. C++11智能指针底层模拟实现
|
存储 Linux C语言
生产者消费者模式保姆级教程 (阻塞队列解除耦合性) 一文帮你从C语言版本到C++ 版本, 从理论到实现 (一文足以)
生产者消费者模式保姆级教程 (阻塞队列解除耦合性) 一文帮你从C语言版本到C++ 版本, 从理论到实现 (一文足以)
生产者消费者模式保姆级教程 (阻塞队列解除耦合性) 一文帮你从C语言版本到C++ 版本, 从理论到实现 (一文足以)
|
设计模式 安全 定位技术
C++从面试常考实现特殊类到单例模式的实现
C++从面试常考实现特殊类到单例模式的实现
C++从面试常考实现特殊类到单例模式的实现
|
存储 Java 应用服务中间件
线程池设计, 从简单的我们平常设计线程池图解,到生活中的类似线程池的处理现实场景, 到简单的C++模拟nginx写的单链表组织工作队列的简单线程池实现 + nginx 部分源码刨析
线程池设计, 从简单的我们平常设计线程池图解,到生活中的类似线程池的处理现实场景, 到简单的C++模拟nginx写的单链表组织工作队列的简单线程池实现 + nginx 部分源码刨析
线程池设计, 从简单的我们平常设计线程池图解,到生活中的类似线程池的处理现实场景, 到简单的C++模拟nginx写的单链表组织工作队列的简单线程池实现 + nginx 部分源码刨析
如何用c++实现异常处理
如何用c++实现异常处理
如何用c++实现异常处理
|
存储 算法 C++
分块刨析从函数原型到分块实现C++STL(vector)
分块刨析从函数原型到分块实现C++STL(vector)
分块刨析从函数原型到分块实现C++STL(vector)