算法学习————自然归并算法(c/c++)
自然归并算法实现(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++)相关推荐
- Surf算法学习心得(一)——算法原理
Surf算法学习心得(一)--算法原理 写在前面的话: Surf算法是对Sift算法的一种改进,主要是在算法的执行效率上,比Sift算法来讲运行更快!由于我也是初学者,刚刚才开始研究这个算法,然而网上 ...
- 算法学习四:算法性能分析理论基础——函数增长与渐进分析
算法学习四:算法性能分析理论基础--函数增长与渐进分析 在算法性能分析过程中,特别是在算法运行效率分析中,我们经常使用渐渐分析法,它使我们在分析算法性能时不必纠结于不同硬件平台的差异性,着重考虑算法的 ...
- 令人拍案叫绝的算法学习网站新手算法入门到精通,算法面试冲刺资料这里都有
(9月已更)学算法认准这6个网站就够了! 写在前面:作为ACM铜牌选手,从FB到腾讯,从事算法&java岗位工作也是5年有余.在工作中接触到了很多同学,在算法学习和算法面试这件事上我还是很有发 ...
- 算法学习之模拟退火算法路径规划(python代码实现)
模拟退火算法路径规划(python代码实现) 一.引言 二.算法介绍以及伪代码 1.算法通俗介绍 2.路径规划算法伪代码 三.算法流程及代码实现 1.地图创建 2.初始化路径 小结 3.计算适应度值 ...
- 【算法学习】贪心算法
参考算导第三版第16章 贪心算法 文章目录 1. 活动选择问题 1.1 活动选择问题的最优子结构 1.2 贪心选择 1.3 递归贪心算法 1.4 迭代贪心算法 2. 贪心算法原理 2.1 贪心选择性质 ...
- 令人拍案叫绝的算法学习网站,算法入门到精通,算法面试冲刺资料这里都有
前言 作为ACM铜牌选手,从FB到腾讯,从事算法&java岗位工作也是5年有余.在工作中接触到了很多同学,在算法学习和算法面试这件事上我还是很有发言权的. 今天就跟想学算法的同学分享一下我私藏 ...
- 数据结构与算法学习③(Hash hash算法的工程应用 递归 )
Hash Hash 散列表(Hash Table) 概述 散列函数 散列冲突 复杂度分析 工程应用 面试实战 亚马逊,微软最近面试题,242. 有效的字母异位词 腾讯,高盛集团最近面试题,49. 字母 ...
- python算法学习代码_python 算法学习部分代码记录篇章1
#-*- coding: utf-8 -*-#@Date : 2017-08-19 20:19:56#@Author : lileilei '''那么算法和数据结构是什么呢,答曰兵法''' '''a+ ...
- 算法学习系列(贪心算法)—机器人攀登问题
问题描述: 要举办一场机器人攀登接力赛,规定攀登总高度为m米,每队参赛机器人个数为n(2≤n≤10),每个机器人只能攀登1次,至少攀登1米,至多攀登k(1≤k≤20)米,并且只能在整米处接力.某队有n ...
最新文章
- 【分布式事务】tcc-transaction分布式TCC型事务框架搭建与实战案例(基于Dubbo/Dubbox)...
- linux fedro版本查看命令,Fedora查看内核及发行版本号
- linux nslookup脚本,Linux中nslookup命令起什么作用呢?
- transform再次理解
- 错误记录(八)could not initialize proxy - no Session
- atomic原子类实现机制_原子操作CAS及其实现类
- win10 原版无捆绑系统下载
- android 自定义柱形图简书,android 自定义网状图
- 腾讯云弹性MapReduce
- 2020-05-15-用于深度学习训练的分布式多租户GPU集群分析
- 螺栓预紧力与拧紧力矩的计算方法
- mysql中+desc用法,数据库desc的用法有哪些用法
- 说说你对keep-alive的理解是什么?
- 对贴片陶瓷电容材料的区分
- 背包问题C/C++语言
- 解决QT问题:运行qmake:Project ERROR: Cannot run compiler ‘cl‘. Output:
- linux下格式化apfs,APFS文件系统科普贴
- 蒂娜交易准则(黄金高胜算交易)
- 华为手机Android系统优缺点,华为手机与iPhone相比有哪些优缺点?
- element ui 导出pdf方法
热门文章
- Linux Ubuntu 修改用户名
- 中电信模板短信服务受关注 重塑短信平台需有互联网思维
- 【PTA】7-21 超速判断 (10分)_中M2020春C入门练习第I段——变量、表达式、分支、循环
- ubuntu20.04 下新建txt/文本文档(笔记)
- Linux虚拟机安装以及联网
- 控制器设计 计算机组成原理,计算机组成原理课程设计-模型计算机控制器的设计.doc...
- Java软件开发好学吗?学完好找工作吗?
- 线性代数(3)矩阵与向量的乘积的两种理解
- 使用Calendar根据当前日期算前一年、前一月、前一天
- 5款办公神器软件,分分钟提高工作效率,职场人一定要知道!