性能分析:

  时间复杂度:O(n*log(n))

  空间复杂度:O(n)

归并排序算法来自于分而治之思想,“归”是“递归”的意思,“并”是"合并“的意思,就是说将复杂的数组排序问题先进性分解,然后递归的解决小问题,最后合并问题的解。

#include<iostream>
#include<vector>
using namespace std;
void sort_merge_recursive(vector<int>& data, int left, int right);
void merge(vector<int>& data, int left, int mid, int right); int main()
{
// 首先找出待排序列中最小的数,然后用这个数和原序列中的第一个数交换位置;
// 其次,找出第二小的和原第二个数交换位置;
// 依次顺序直到找到第二大的数,之后原数列完全变成有序数列.
vector<int> data = { 3,0,5,2,7,8,9,6,1 };
//获取序列元素个数
int length = 9;
int left = 0;
int right = 8;
sort_merge_recursive(data, left, right); for (int i = 0; i < length; i++)
{
cout << data[i] << " ";
}
} void sort_merge_recursive(vector<int> &data, int left, int right)
{
if (left < right)//暗含如果left>=right就不做任何操作,因为这个时候表示已经分解到只剩一个元素了,天然有序
{
//将序列一分为二获取中间位置
int mid = (left + right) / 2;
//递归处理两个子序列使之有序
sort_merge_recursive(data, left, mid);
sort_merge_recursive(data, mid + 1, right);
//合并两个有序子序列
merge(data, left, mid, right);
}
} void merge(vector<int> &data, int left, int mid, int right)
{
//将有序的两个子序列合并起来
//获取两个子序列的第一个元素
int i = left;
int j = mid + 1;
//创建临时容器来保存合并结果,同时指定容器大小
vector<int> temp;
temp.resize(right - left + 1);//从图中最底下开始往上合并,每一次因为要合并两个子序列,所以容器大小要从新设置
//开始合并
int k = 0;//临时容器的索引
while (i <= mid && j <= right)
{
if (data.at(i) <= data.at(j))//如果左边的值元素值小于右边的
{
temp.at(k++) = data.at(i++);//先把小的放到数组前面
}
else
{
temp.at(k++) = data.at(j++);
}
}
//到这里肯定已经有一个子序列的所有元素已经完全放到了容器里,接着放另一个剩下的元素
while (i <= mid)//因为不知道是哪个完全放进去了,用这种方式来判断
{
temp.at(k++) = data.at(i++);
}
while (j <= right)
{
temp.at(k++) = data.at(j++);
} //只能通过这样的方式将临时容器元素复制给原始容器得到结果
for (int n = 0; n < k; n++)
{
data.at(left++) = temp.at(n);
}
}

最新文章

  1. .NET跨平台之旅:增加文件日志功能遇到的挫折
  2. Oracle 查看某表 被哪些表外键引用
  3. WIN10 多用户登录
  4. 在ssh中利用Solr服务建立的界面化站内搜索---solr2
  5. ubuntu 14.04 解决JavaMelody 图片中文乱码
  6. 产生0-9 A-Z a-z
  7. ubuntu13.04云主机部署gitlab6.6
  8. 通用SQL存储过程分页以及asp.net后台调用
  9. hdoj 1856 More is better【求树的节点数】
  10. 安装SQL Server2005出现 IIS警告原因
  11. Android : 如何在WebView显示的页面中查找内容
  12. Android 电话自己主动接听和挂断具体解释
  13. iOS基础 - UIWebView
  14. [bzoj1565][NOI2009]植物大战僵尸_网络流_拓扑排序
  15. Git Push:error: Couldn't set refs/remotes/origin/master;error: update_ref failed for ref 'refs/remot
  16. 转://Oracle 11gR2 ASM磁盘组管理
  17. 九个PHP很有用的功能
  18. DirectShow SDK下载
  19. 【校招面试 之 C/C++】第26题 C++ 智能指针(二)之 share_ptr
  20. hive创建临时函数

热门文章

  1. 【应用服务 App Service】Azure 应用服务测试网络访问其他域名及请求超时限制(4分钟 ≈ 230秒)
  2. springcloud中使用dubbo开发rpc服务及调用
  3. redis限频
  4. JDK源码阅读-------自学笔记(二十五)(java.util.Vector 自定义讲解)
  5. A. Peter and Snow Blower 解析(思維、幾何)
  6. ubuntu20.04 编译安装ckermit
  7. 【转载】HPL与HPCG测试(一)
  8. CodeForces 1067E Random Forest Rank
  9. Java学习的第三十七天
  10. [Luogu P3986] 斐波那契数列 (逆元)