归并排序(基于顺序容器vector_递归;基于数组array_递归_非递归)
代码1:基于顺序容器vector
1 /*2 * FILE: merge_sort_vector.cpp3 * ---------------------------4 * DATE: 201708185 * 归并排序,使用顺序容器vector6 *7 */8 9 #include <iostream>10 #include <vector>11 12 void merge(std::vector<int> &v, std::vector<int> &v1, std::vector<int> &v2);13 14 /* recursive 递归 一分两半 */15 void sort(std::vector<int> &v)16 {17 int n = v.size();18 if(n <= 1)19 return;20 std::vector<int> v1;21 std::vector<int> v2;22 for(int i = 0; i < n; i++)23 {24 if(i < n/2)25 v1.push_back(v[i]);26 else 27 v2.push_back(v[i]);28 } 29 sort(v1);30 sort(v2);31 v.clear();32 merge(v, v1, v2);33 } 34 35 /* 合并 排序 */36 void merge(std::vector<int> &v, std::vector<int> &v1, std::vector<int> &v2)37 {38 int n1 = v1.size();39 int n2 = v2.size();40 int p1 = 0, p2 = 0;41 while(p1 < n1 || p2 < n2)42 {43 if(p1 >= n1)44 v.push_back(v2[p2++]);45 else if(p2 >= n2)46 v.push_back(v1[p1++]);47 else if(v1[p1] < v2[p2])48 v.push_back(v1[p1++]);49 else50 v.push_back(v2[p2++]);51 }52 }53 54 /* 使用vector的迭代器 打印输出 */55 void display(std::vector<int> &v)56 {57 for(std::vector<int>::iterator iter = v.begin(); iter != v.end(); iter++)58 std::cout<< *iter <<" ";59 std::cout<< std::endl;60 }61 62 int main()63 {64 int a[] = {3,4,2,1,7,5,8,9,0,6};65 int length = sizeof(a) / sizeof(int);66 std::vector<int> vec(a, a+length-1);67 sort(vec);68 display(vec);69 return 0;70 }
代码2:基于数组(递归法、非递归)
1 /*2 * FIEL: merge_sort.cpp3 * --------------------4 * DATE: 201708185 * 归并排序:先一分两半,分别进行排序;再合并两个已排好序的数组6 *7 */8 9 #include <iostream>10 11 /* 12 * merge two sorted sub-array13 * 合并两个已排好序的数组 14 */15 void merge(int a[], int result[], int begin, int middle, int length)16 {17 //int result[length];18 int left = begin, right = middle;19 int index = begin;20 while(left < middle || right < length)21 {22 if(left >= middle)23 {24 result[index++] = a[right++];25 //right++;26 }27 else if(right >= length)28 {29 result[index++] = a[left++];30 //left++;31 }32 else if(a[left] < a[right])33 {34 result[index++] = a[left++];35 //left++;36 }37 else // a[left] >= a[right]38 {39 result[index++] = a[right++];40 //right++;41 }42 //index++;43 }44 for(int i = begin; i < length; i++)45 a[i] = result[i];46 }47 48 /* recursive 递归 */49 void mergeSort_recursive(int a[], int temp[], int begin, int length)50 {51 if(length - begin <= 1)52 return;53 int middle = (begin + length) / 2;54 mergeSort_recursive(a, temp, begin, middle);55 mergeSort_recursive(a, temp, middle, length);56 merge(a, temp, begin, middle, length);57 58 }59 60 void mergeSort_recursive(int a[], int length)61 {62 int *temp = new int[length];63 mergeSort_recursive(a, temp, 0, length);64 delete []temp;65 }66 67 /* non_recursive 非递归 */68 void mergeSort(int a[], int length)69 {70 int *temp = new int[length];71 for(int step = 1; step < length; step = step * 2)72 {73 for(int left = 0; left < length; left = left + 2 * step)74 {75 int middle = std::min(left + step, length);76 int right = std::min(left + 2 * step, length);77 merge(a, temp, left, middle, right);78 }79 }80 delete []temp;81 }82 83 int main(int argc, char *argv[])84 {85 int a[] = {3,4,2,1,7,5,8,9,0,6};86 int length = sizeof(a) / sizeof(int);87 std::cout<< "递归法:";88 mergeSort_recursive(a, length); //递归法89 for(int i = 0; i < length; i++)90 std::cout<< a[i] << " ";91 std::cout<< std::endl;92 93 int b[] = {3,4,2,1,7,5,8,9,0,6};94 mergeSort(b, length); //非递归95 std::cout<< "非递归:";96 for(int i = 0; i < length; i++)97 std::cout<< b[i] << " ";98 std::cout<< std::endl;99 return 0;
100 }
归并排序(基于顺序容器vector_递归;基于数组array_递归_非递归)相关推荐
- 快速排序(基于顺序容器vector;基于数组array)
代码1:基于顺序容器vector 1 /*2 * FILE: quick_sort_vector.cpp3 * ---------------------------4 * DATE: 2017081 ...
- c语言以顺序结构存储的二叉树的非递归遍历,C语言二叉树的非递归遍历实例分析...
本文以实例形式讲述了C语言实现二叉树的非递归遍历方法.是数据结构与算法设计中常用的技巧.分享给大家供大家参考.具体方法如下: 先序遍历: void preOrder(Node *p) //非递归 { ...
- 查找树的指定层级_非递归层次遍历方法实现二叉树中指定节点的层次数查找
数据结构教材中,提供了基于队列实现一个二叉树的非递归层次遍历算法.但对于一个任意二叉树,如果要查找其中任何一个节点所在的层次数,教科书中并没有给出基于层次遍历的非递归算法.鉴于层次遍历算法比较容易理解 ...
- mysql递归查询所有上下节点_非递归打印二叉树的所有路径,保存父节点和孩子节点到底有啥差别...
题目解读 题目要求输出二叉树的所有路径(字符串形式),乍一看很简单,不就是二叉树的遍历嘛!其实不然,首先,我们用非递归的方式(C++)解决这道题(递归在产品代码中是不允许使用的,其次定位 bug 的时 ...
- java中递归与迭代的比较_深究递归和迭代的区别、优缺点及实例对比
1.迭代是人,递归是神! 从"编程之美"的角度看,可以借用一句非常经典的话:"迭代是人,递归是神!"来从宏观上对二者进行把握. 从概念上讲,递归就是指程序调用自 ...
- 数据结构_非递归遍历二叉树(C语言)
数据结构总目录 非递归遍历二叉树 1. 图文解析 对于链式二叉树,如果要用非递归的方式进行前.中.后序遍历,则需要借助一个栈实现,而层序遍历则需要借助队列来实现. 构建如下二叉树: 非递归先序遍历 ( ...
- 非递归快速排序php,快排序的非递归实现(原创)
本文简要介绍快排序的非递归实现方式并给出了C语言版本的源代码,非递归实现由于没有函数调用的消耗,相对于递归方式有一定的优势. 在快排序的递归实现中,函数quicksort(int nlow, int ...
- python1到n的所有排列_非递归输出1-N的全排列的方法详解
下面小编就为大家带来一篇非递归的输出1-N的全排列实例(推荐).小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 网易游戏笔试题算法题之一,可以用C++,Java,Pyth ...
- php 非递归调用,php 无限分类(非递归)
/** * 无限分类 * 2011/8/24 * kcj * */ include "../conn/conn.php"; $flpid=$_POST['flpid']; $flt ...
最新文章
- Android设备的网络抓包
- 启动和停止Oracle服务bat脚本
- 计算机小狐狸操作,小狐狸发明记之叮咚快跑新手攻略 快速上手游戏
- [C++] - 面向对象-图书管理系统
- 前端开发~uni-app ·[项目-仿糗事百科] 学习笔记 ·005【设置全局属性globalStyle】
- 软件测试基础:自动化测试、安全测试、性能测试
- 国内国外最好的java开发论坛及站点 [转]
- Oracle学习之路-- 案例分析实现行列转换的几种方式
- Linux脚本实战之SSH执行远端脚本
- html实现“加入收藏”代码
- 考研英语 - 句子的结构 - 语法
- whitening(白化)
- latex参考文献bib基本格式_Latex如何添加参考文献——使用bib
- 央行等8部委发文规范供应链金融,严禁无牌开展相关业务
- POJ 3322 Bloxorz I
- Pandas处理日期数据的常见操作集锦
- 计算机丢失d3dx9_27.dll,d3dx9_27.dll
- Electron教程2_Windows上安装Electron
- PVE迁移的一些问题
- 华为OLT设备EPON/GPON混插管理