算法学习————自然归并算法(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 ...
最新文章
- 使用HttpOnly提升Cookie安全性
- 小白该如何学习Linux操作系统(2)
- 5.16 12周第二课
- 玩转12306之查询、订票
- Spring Security 入门(3-11)Spring Security 的使用-自定义登录验证和回调地址
- 设计模式之-观察者模式(Observer Design Pattern)
- shell tr 替换 空格_shell tr命令
- windows下 mysql 转移data目录
- halcon区域腐蚀膨胀算子_Halcon算子
- 7-12(图) 社交网络图中结点的“重要性”计算(30 分)
- Android--多线程之Handler
- Tidabie Tidal Music 潮汐音乐下载转换器
- android 主流机型排行,安卓手机性能排行:华为Mate40 Pro仅排第四,第一名无可撼动...
- 一笔画:五环,python-turtle。画圆圈
- 什么是数据仓库的主题
- Tomcat优化操作
- 5、微信小程序-网络请求和本地存储
- rsa 长密钥实现及测试
- html网页比赛演讲稿,故事大王比赛的演讲稿范文(精选5篇)
- 有多少域名被漏掉了?
热门文章
- 自学视频Java、电子书、技术教程、框架网站整理集合
- 一个C/C++程序的一生:从源程序到可执行程序再到进程
- CSDN博客添加QQ好友按钮
- python3.x 批量将Coursera字幕格式.vtt转换为.srt格式
- 来自经典“打火机”的攻击——MCU抗干扰实验系列专题(7)
- docker查看错误日志
- 大数据的简介及Hadoop单机和分布式安装方法1
- Python 处理ios国际化文件,从strings读取到excel表
- 用三元组存储稀疏矩阵及其快速转置
- CodeForces 90B African Crossword【模拟】