合并排序在众多排序算法中算是比较稳定的排序算法,时间复杂度为nlogn,采取分治的思想,可以说是比较高效的的排序算法。
开始将长度为len的数组分为长度为1的len个子序列,开始作如下按照从小到大顺序合并:

直到合并成一个长度和正数组长度相等的子序列即可。


下面是代码的非递归实现实现:

#include <iostream>
#include<vector>
using namespace std ;void merge(vector<int>&ls, vector<int>&tmp, int l, int m, int r) {int left = l ;int k = l ;int mid = m+1 ;//将当前段的元素转移到tmp数组中相应位置while(left<=m&&mid<=r) {if(ls[left] > ls[mid]) {tmp[k++] = ls[mid++];}else {tmp[k++] = ls[left++] ;}   }if(left <= m) {while(left <= m) {tmp[k++] = ls[left++] ;}}else {while(mid<=r) {tmp[k++] = ls[mid++] ;}}
}void mergePass(vector<int>&ls, vector<int>&tmp, int s, int n) {int i= 0;   while(i<=n-2*s) {//将前一组长度为s个元素合并merge(ls, tmp, i, i+s-1, i+2*s-1) ;i = i+2*s ;}//剩余的元素少于3s的话if(i+s<n) {merge(ls, tmp, i, i+s-1, n-1) ;}else {for(int k=i; k<=n-1; k++) {tmp[k] = ls[k] ;}}
}//合并排序非递归
void mergeSort(vector<int>&ls) {   vector<int>tmp =ls ;int s= 1 ;int len = ls.size();while(s<len) {mergePass(ls, tmp, s, len) ;s+=s ;mergePass(tmp, ls, s, len) ;s+=s ;}
}int main()
{vector<int>ls ;while(1) {int n ;cin >> n ;if(n == -1) {break ;}ls.push_back(n) ;}mergeSort(ls) ;for(int i=0; i<(int)ls.size(); i++) {cout << ls[i] <<"  "  ;}return 0;
}

合并排序非递归实现总结相关推荐

  1. 合并排序 非递归 java_合并排序-非递归

    #include //合并排序非递归--自然合并排序 typedef int Type; using namespace std; void Merge(Type c[],Type d[],int l ...

  2. 程序员面试系列——合并排序(递归实现)

    合并排序基本思想 合并排序,或者叫归并排序,在算法思想中属于分治法.对于一个需要排序的数组,合并排序把它一分为二,并对每个子数组递归排序,然后把这两个排好序的子数组合并为一个有序数组. 本文要介绍两种 ...

  3. 合并排序的非递归实现(自底向上设计)

    上一篇博文,讨论了合并排序的递归实现.这篇文章,说说合并排序的非递归实现. 思路描述 假设一个数组,共有11个(0到10)元素. 首先,进行"1+1"合并:即第0个和第1个合并,第 ...

  4. 归并排序(非递归,Java实现)

    归并排序(非递归):自底向上 public class MergeSort {/*** @param arr 待排序的数组* @param left 本次归并的左边界* @param mid 本次归并 ...

  5. 深度优先搜索(DFS)递归形式改为非递归形式

    DFS将递归改为非递归这个方法的需求来自于一道三维积木组合的题目,还在苦苦调试中,暂且不提. 普通的认识对于递归向非递归的转化无非是使用栈,但是结合到深度搜索如何将栈很好利用,如何很好保存现场,都不是 ...

  6. java合并排序_Java中的合并排序算法

    合并排序算法是一种分而治之的算法.在分而治之的范式中,一个问题被分解成较小的问题,其中每个小问题仍然保留着大问题的所有属性--大小除外.为了解决原始问题,每个部分都是单独解决的,然后这些部分又合并在一 ...

  7. 合并排序算法排序过程_基本算法:合并排序

    合并排序算法排序过程 每个程序员都需要了解他们的算法和数据结构. 在研究它们时,您需要确保确切了解它的功能,时间和空间的复杂性以及采用这种方式的原因,并且不仅能够对其进行编码,而且能够手动执行. 这就 ...

  8. C++非递归合并排序的通用实现算法(附完整源码)

    C++非递归合并排序的通用实现算法 C++非递归合并排序的通用实现算法完整源码(定义,实现,main函数测试) C++非递归合并排序的通用实现算法完整源码(定义,实现,main函数测试) #inclu ...

  9. 合并两个排序的链表递归和非递归C++实现

    题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,要求合成后的链表满足单调不减规则. 1.分析 已知输入的两个链表递增有序,要使输出的链表依然递增有序,可以依次从输入的两个链表中挑选最小的 ...

最新文章

  1. 做了一个系列的Android开发教程列表
  2. android 5.0主题风格研究
  3. 计算机学院大学生程序设计竞赛(2015’11)1007 油菜花王国
  4. Python帮你识破双11的套路
  5. 1021 个位数统计 (15 分
  6. 云测试软件详解,软件测试之登录测试详解
  7. 在intellij idea 中怎么不用git 解除关联
  8. 扫描控件Web在线Applet
  9. mysql数据自定义随机_MySQL 利用事务自定义插入随机数据
  10. OpenCV精进之路(十一):感兴趣区域ROI和logo添加技术
  11. 转: hibernate配置文件hibernate.cfg.xml和.hbm.xml的详细解释
  12. [转]asp实现数据库导出excel文件
  13. centos8终端fish安装
  14. 7-60 致命的珠宝 (10分)
  15. (附源码)springboot自律健身房会员管理系统 毕业设计456466
  16. 镁客网每周硬科技领域投融资汇总(10.21-10.27),AI芯片创企Syntiant获英特尔等头部企业投资...
  17. oracle周数计算
  18. 第二课 小企鹅迷宫探宝
  19. 企鹅号怎么赚钱,企鹅号怎么运营,企鹅号怎么写爆文
  20. 不能拖动CAD文件到CAD窗口打开,解决方案

热门文章

  1. 图像处理中的mask(掩膜)
  2. NBIOT下行harq
  3. 如何成为入门程序员?
  4. 中小企业也有机会!物联网的战场硝烟
  5. 年中盘点:详细分析2019年上半年爆发的macOS恶意软件
  6. 华清远见重庆中心—后端基础阶段技术总结/个人总结
  7. VINF_FUSION编译出现大量的error: ‘CV_CALIB_CB_ADAPTIVE_THRESH’ was not declared in this scope错误
  8. Windows文件删不掉:无法设置新所有者
  9. win10 Go语言下载与安装
  10. 上古卷轴python_瑞云动态