自然归并算法实现(c/c++)

前言:由于归并算法的资料已经很多了,本文主要讲述的是自然归并算法

自然归并算法VS归并算法

自然归并算法实际上是归并算法的一个变型。

例如在下文实例代码中的数组a中的元素为{6,1,9,4,5,8,7,2,3},在数组中的自然排序为{6},{1,9},{4,5,8},{7},{2,3}。接着根据自然排序将相邻的排好序的子数组进行归并排序,这就是自然归并排序算法的基本思想。

通常情况下,自然归并算法需要合并的次数比归并算法要少,而在极端情况下,如:对于已经排好序的n元数组。自然归并算法无需归并操作,算法时间复杂为O(n),而归并算法则需执行logn次合并操作,算法时间复杂度为O(nlogn)。

代码实现

//WAIKIT
#include <iostream>using namespace std;int getIndex(int *a,int *b,int a_size) {//初次遍历,划分本来就排序好的子数组int j = 0;b[j++] = 0;for (int i = 0; i < a_size - 1; i++) {if (a[i + 1] < a[i]) {b[j++] = i + 1;}}b[j] = a_size; //方便mergepass操作return j;
}void Merge(int c[], int d[], int l, int m, int r) {//归并int i = l, j = m + 1, k = l;while ((i <= m) && (j <= r)) {if (c[i] <= c[j]) {d[k++] = c[i++];}else {d[k++] = c[j++];}}if (i > m) {for (int q = j; q <= r; q++) {d[k++] = c[q];}}if (j > r) {for (int q = i; q <= m; q++) {d[k++] = c[q];}}
}void mergepass(int x[], int y[], int s, int index[], int n,int x_size) {int i = 0;while (i <= n - 2 * s) {Merge(x, y, index[i], index[i + s] - 1, index[i + 2 * s] - 1);i = i + 2 * s;}if (i + s < n) {                       //剩下的子数组少于2s个Merge(x, y, index[i], index[i + s] - 1, x_size - 1);}else{    if (i < n) {for (int j = index[i+1]; j < x_size; j++) {y[j] = x[j];}}}
}void MergeSort(int a[],int index[],int n,int a_size) {// s为合并子数组的大小 n为总的子数组个数int *b = new int[a_size];int s = 1;while (s < n) {mergepass(a, b, s, index, n, a_size);  //a-->bs += s;mergepass(b, a, s, index, n, a_size);  //b-->as += s;}}int main() {int a[] = { 6,1,2,8,4,5,7,9,3};int a_size = sizeof(a) / sizeof(a[0]);int index[sizeof(a)/sizeof(a[0])] = { 0 };int index_size = getIndex(a, index, a_size);MergeSort(a, index, index_size,a_size);for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++) {cout << a[i] << ' ';}cout << endl;system("pause");return 0;
}

新人博主,如有问题欢迎大家在评论区指正~

算法学习————自然归并算法(c/c++)相关推荐

  1. Surf算法学习心得(一)——算法原理

    Surf算法学习心得(一)--算法原理 写在前面的话: Surf算法是对Sift算法的一种改进,主要是在算法的执行效率上,比Sift算法来讲运行更快!由于我也是初学者,刚刚才开始研究这个算法,然而网上 ...

  2. 算法学习四:算法性能分析理论基础——函数增长与渐进分析

    算法学习四:算法性能分析理论基础--函数增长与渐进分析 在算法性能分析过程中,特别是在算法运行效率分析中,我们经常使用渐渐分析法,它使我们在分析算法性能时不必纠结于不同硬件平台的差异性,着重考虑算法的 ...

  3. 令人拍案叫绝的算法学习网站新手算法入门到精通,算法面试冲刺资料这里都有

    (9月已更)学算法认准这6个网站就够了! 写在前面:作为ACM铜牌选手,从FB到腾讯,从事算法&java岗位工作也是5年有余.在工作中接触到了很多同学,在算法学习和算法面试这件事上我还是很有发 ...

  4. 算法学习之模拟退火算法路径规划(python代码实现)

    模拟退火算法路径规划(python代码实现) 一.引言 二.算法介绍以及伪代码 1.算法通俗介绍 2.路径规划算法伪代码 三.算法流程及代码实现 1.地图创建 2.初始化路径 小结 3.计算适应度值 ...

  5. 【算法学习】贪心算法

    参考算导第三版第16章 贪心算法 文章目录 1. 活动选择问题 1.1 活动选择问题的最优子结构 1.2 贪心选择 1.3 递归贪心算法 1.4 迭代贪心算法 2. 贪心算法原理 2.1 贪心选择性质 ...

  6. 令人拍案叫绝的算法学习网站,算法入门到精通,算法面试冲刺资料这里都有

    前言 作为ACM铜牌选手,从FB到腾讯,从事算法&java岗位工作也是5年有余.在工作中接触到了很多同学,在算法学习和算法面试这件事上我还是很有发言权的. 今天就跟想学算法的同学分享一下我私藏 ...

  7. 数据结构与算法学习③(Hash hash算法的工程应用 递归 )

    Hash Hash 散列表(Hash Table) 概述 散列函数 散列冲突 复杂度分析 工程应用 面试实战 亚马逊,微软最近面试题,242. 有效的字母异位词 腾讯,高盛集团最近面试题,49. 字母 ...

  8. python算法学习代码_python 算法学习部分代码记录篇章1

    #-*- coding: utf-8 -*-#@Date : 2017-08-19 20:19:56#@Author : lileilei '''那么算法和数据结构是什么呢,答曰兵法''' '''a+ ...

  9. 算法学习系列(贪心算法)—机器人攀登问题

    问题描述: 要举办一场机器人攀登接力赛,规定攀登总高度为m米,每队参赛机器人个数为n(2≤n≤10),每个机器人只能攀登1次,至少攀登1米,至多攀登k(1≤k≤20)米,并且只能在整米处接力.某队有n ...

最新文章

  1. 使用HttpOnly提升Cookie安全性
  2. 小白该如何学习Linux操作系统(2)
  3. 5.16 12周第二课
  4. 玩转12306之查询、订票
  5. Spring Security 入门(3-11)Spring Security 的使用-自定义登录验证和回调地址
  6. 设计模式之-观察者模式(Observer Design Pattern)
  7. shell tr 替换 空格_shell tr命令
  8. windows下 mysql 转移data目录
  9. halcon区域腐蚀膨胀算子_Halcon算子
  10. 7-12(图) 社交网络图中结点的“重要性”计算(30 分)
  11. Android--多线程之Handler
  12. Tidabie Tidal Music 潮汐音乐下载转换器
  13. android 主流机型排行,安卓手机性能排行:华为Mate40 Pro仅排第四,第一名无可撼动...
  14. 一笔画:五环,python-turtle。画圆圈
  15. 什么是数据仓库的主题
  16. Tomcat优化操作
  17. 5、微信小程序-网络请求和本地存储
  18. rsa 长密钥实现及测试
  19. html网页比赛演讲稿,故事大王比赛的演讲稿范文(精选5篇)
  20. 有多少域名被漏掉了?

热门文章

  1. 自学视频Java、电子书、技术教程、框架网站整理集合
  2. 一个C/C++程序的一生:从源程序到可执行程序再到进程
  3. CSDN博客添加QQ好友按钮
  4. python3.x 批量将Coursera字幕格式.vtt转换为.srt格式
  5. 来自经典“打火机”的攻击——MCU抗干扰实验系列专题(7)
  6. docker查看错误日志
  7. 大数据的简介及Hadoop单机和分布式安装方法1
  8. Python 处理ios国际化文件,从strings读取到excel表
  9. 用三元组存储稀疏矩阵及其快速转置
  10. CodeForces 90B African Crossword【模拟】