自然归并算法实现(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. 【分布式事务】tcc-transaction分布式TCC型事务框架搭建与实战案例(基于Dubbo/Dubbox)...
  2. linux fedro版本查看命令,Fedora查看内核及发行版本号
  3. linux nslookup脚本,Linux中nslookup命令起什么作用呢?
  4. transform再次理解
  5. 错误记录(八)could not initialize proxy - no Session
  6. atomic原子类实现机制_原子操作CAS及其实现类
  7. win10 原版无捆绑系统下载
  8. android 自定义柱形图简书,android 自定义网状图
  9. 腾讯云弹性MapReduce
  10. 2020-05-15-用于深度学习训练的分布式多租户GPU集群分析
  11. 螺栓预紧力与拧紧力矩的计算方法
  12. mysql中+desc用法,数据库desc的用法有哪些用法
  13. 说说你对keep-alive的理解是什么?
  14. 对贴片陶瓷电容材料的区分
  15. 背包问题C/C++语言
  16. 解决QT问题:运行qmake:Project ERROR: Cannot run compiler ‘cl‘. Output:
  17. linux下格式化apfs,APFS文件系统科普贴
  18. 蒂娜交易准则(黄金高胜算交易)
  19. 华为手机Android系统优缺点,华为手机与iPhone相比有哪些优缺点?
  20. element ui 导出pdf方法

热门文章

  1. Linux Ubuntu 修改用户名
  2. 中电信模板短信服务受关注 重塑短信平台需有互联网思维
  3. 【PTA】7-21 超速判断 (10分)_中M2020春C入门练习第I段——变量、表达式、分支、循环
  4. ubuntu20.04 下新建txt/文本文档(笔记)
  5. Linux虚拟机安装以及联网
  6. 控制器设计 计算机组成原理,计算机组成原理课程设计-模型计算机控制器的设计.doc...
  7. Java软件开发好学吗?学完好找工作吗?
  8. 线性代数(3)矩阵与向量的乘积的两种理解
  9. 使用Calendar根据当前日期算前一年、前一月、前一天
  10. 5款办公神器软件,分分钟提高工作效率,职场人一定要知道!