代码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_递归_非递归)相关推荐

  1. 快速排序(基于顺序容器vector;基于数组array)

    代码1:基于顺序容器vector 1 /*2 * FILE: quick_sort_vector.cpp3 * ---------------------------4 * DATE: 2017081 ...

  2. c语言以顺序结构存储的二叉树的非递归遍历,C语言二叉树的非递归遍历实例分析...

    本文以实例形式讲述了C语言实现二叉树的非递归遍历方法.是数据结构与算法设计中常用的技巧.分享给大家供大家参考.具体方法如下: 先序遍历: void preOrder(Node *p) //非递归 { ...

  3. 查找树的指定层级_非递归层次遍历方法实现二叉树中指定节点的层次数查找

    数据结构教材中,提供了基于队列实现一个二叉树的非递归层次遍历算法.但对于一个任意二叉树,如果要查找其中任何一个节点所在的层次数,教科书中并没有给出基于层次遍历的非递归算法.鉴于层次遍历算法比较容易理解 ...

  4. mysql递归查询所有上下节点_非递归打印二叉树的所有路径,保存父节点和孩子节点到底有啥差别...

    题目解读 题目要求输出二叉树的所有路径(字符串形式),乍一看很简单,不就是二叉树的遍历嘛!其实不然,首先,我们用非递归的方式(C++)解决这道题(递归在产品代码中是不允许使用的,其次定位 bug 的时 ...

  5. java中递归与迭代的比较_深究递归和迭代的区别、优缺点及实例对比

    1.迭代是人,递归是神! 从"编程之美"的角度看,可以借用一句非常经典的话:"迭代是人,递归是神!"来从宏观上对二者进行把握. 从概念上讲,递归就是指程序调用自 ...

  6. 数据结构_非递归遍历二叉树(C语言)

    数据结构总目录 非递归遍历二叉树 1. 图文解析 对于链式二叉树,如果要用非递归的方式进行前.中.后序遍历,则需要借助一个栈实现,而层序遍历则需要借助队列来实现. 构建如下二叉树: 非递归先序遍历 ( ...

  7. 非递归快速排序php,快排序的非递归实现(原创)

    本文简要介绍快排序的非递归实现方式并给出了C语言版本的源代码,非递归实现由于没有函数调用的消耗,相对于递归方式有一定的优势. 在快排序的递归实现中,函数quicksort(int nlow, int ...

  8. python1到n的所有排列_非递归输出1-N的全排列的方法详解

    下面小编就为大家带来一篇非递归的输出1-N的全排列实例(推荐).小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 网易游戏笔试题算法题之一,可以用C++,Java,Pyth ...

  9. php 非递归调用,php 无限分类(非递归)

    /** * 无限分类 * 2011/8/24 * kcj * */ include "../conn/conn.php"; $flpid=$_POST['flpid']; $flt ...

最新文章

  1. Android设备的网络抓包
  2. 启动和停止Oracle服务bat脚本
  3. 计算机小狐狸操作,小狐狸发明记之叮咚快跑新手攻略 快速上手游戏
  4. [C++] - 面向对象-图书管理系统
  5. 前端开发~uni-app ·[项目-仿糗事百科] 学习笔记 ·005【设置全局属性globalStyle】
  6. 软件测试基础:自动化测试、安全测试、性能测试
  7. 国内国外最好的java开发论坛及站点 [转]
  8. Oracle学习之路-- 案例分析实现行列转换的几种方式
  9. Linux脚本实战之SSH执行远端脚本
  10. html实现“加入收藏”代码
  11. 考研英语 - 句子的结构 - 语法
  12. whitening(白化)
  13. latex参考文献bib基本格式_Latex如何添加参考文献——使用bib
  14. 央行等8部委发文规范供应链金融,严禁无牌开展相关业务
  15. POJ 3322 Bloxorz I
  16. Pandas处理日期数据的常见操作集锦
  17. 计算机丢失d3dx9_27.dll,d3dx9_27.dll
  18. Electron教程2_Windows上安装Electron
  19. PVE迁移的一些问题
  20. 华为OLT设备EPON/GPON混插管理

热门文章

  1. PCB布局布线(3)——PCB接地设计
  2. 四川大学大学计算机基础期末考试题库,四川大学大学计算机基础
  3. 在互联网行业如何高效快速接单子
  4. Python爬取淘宝评论!听说差评才是最真实的?
  5. linux系统日志文件夹加密,linux系统环境下,对文件进行加密
  6. 【云原生 | 25】Docker运行数据库实战之MongoDB
  7. 数学规划应用|26℃穿衣法则
  8. mysql查询未讲课教师_mysql练习
  9. 多摄像机网络智能视频监控系统设计与实现
  10. 结合我的大学经历谈谈如何学习前端