合并排序非递归实现总结
合并排序在众多排序算法中算是比较稳定的排序算法,时间复杂度为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;
}
合并排序非递归实现总结相关推荐
- 合并排序 非递归 java_合并排序-非递归
#include //合并排序非递归--自然合并排序 typedef int Type; using namespace std; void Merge(Type c[],Type d[],int l ...
- 程序员面试系列——合并排序(递归实现)
合并排序基本思想 合并排序,或者叫归并排序,在算法思想中属于分治法.对于一个需要排序的数组,合并排序把它一分为二,并对每个子数组递归排序,然后把这两个排好序的子数组合并为一个有序数组. 本文要介绍两种 ...
- 合并排序的非递归实现(自底向上设计)
上一篇博文,讨论了合并排序的递归实现.这篇文章,说说合并排序的非递归实现. 思路描述 假设一个数组,共有11个(0到10)元素. 首先,进行"1+1"合并:即第0个和第1个合并,第 ...
- 归并排序(非递归,Java实现)
归并排序(非递归):自底向上 public class MergeSort {/*** @param arr 待排序的数组* @param left 本次归并的左边界* @param mid 本次归并 ...
- 深度优先搜索(DFS)递归形式改为非递归形式
DFS将递归改为非递归这个方法的需求来自于一道三维积木组合的题目,还在苦苦调试中,暂且不提. 普通的认识对于递归向非递归的转化无非是使用栈,但是结合到深度搜索如何将栈很好利用,如何很好保存现场,都不是 ...
- java合并排序_Java中的合并排序算法
合并排序算法是一种分而治之的算法.在分而治之的范式中,一个问题被分解成较小的问题,其中每个小问题仍然保留着大问题的所有属性--大小除外.为了解决原始问题,每个部分都是单独解决的,然后这些部分又合并在一 ...
- 合并排序算法排序过程_基本算法:合并排序
合并排序算法排序过程 每个程序员都需要了解他们的算法和数据结构. 在研究它们时,您需要确保确切了解它的功能,时间和空间的复杂性以及采用这种方式的原因,并且不仅能够对其进行编码,而且能够手动执行. 这就 ...
- C++非递归合并排序的通用实现算法(附完整源码)
C++非递归合并排序的通用实现算法 C++非递归合并排序的通用实现算法完整源码(定义,实现,main函数测试) C++非递归合并排序的通用实现算法完整源码(定义,实现,main函数测试) #inclu ...
- 合并两个排序的链表递归和非递归C++实现
题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,要求合成后的链表满足单调不减规则. 1.分析 已知输入的两个链表递增有序,要使输出的链表依然递增有序,可以依次从输入的两个链表中挑选最小的 ...
最新文章
- 做了一个系列的Android开发教程列表
- android 5.0主题风格研究
- 计算机学院大学生程序设计竞赛(2015’11)1007 油菜花王国
- Python帮你识破双11的套路
- 1021 个位数统计 (15 分
- 云测试软件详解,软件测试之登录测试详解
- 在intellij idea 中怎么不用git 解除关联
- 扫描控件Web在线Applet
- mysql数据自定义随机_MySQL 利用事务自定义插入随机数据
- OpenCV精进之路(十一):感兴趣区域ROI和logo添加技术
- 转: hibernate配置文件hibernate.cfg.xml和.hbm.xml的详细解释
- [转]asp实现数据库导出excel文件
- centos8终端fish安装
- 7-60 致命的珠宝 (10分)
- (附源码)springboot自律健身房会员管理系统 毕业设计456466
- 镁客网每周硬科技领域投融资汇总(10.21-10.27),AI芯片创企Syntiant获英特尔等头部企业投资...
- oracle周数计算
- 第二课 小企鹅迷宫探宝
- 企鹅号怎么赚钱,企鹅号怎么运营,企鹅号怎么写爆文
- 不能拖动CAD文件到CAD窗口打开,解决方案
热门文章
- 图像处理中的mask(掩膜)
- NBIOT下行harq
- 如何成为入门程序员?
- 中小企业也有机会!物联网的战场硝烟
- 年中盘点:详细分析2019年上半年爆发的macOS恶意软件
- 华清远见重庆中心—后端基础阶段技术总结/个人总结
- VINF_FUSION编译出现大量的error: ‘CV_CALIB_CB_ADAPTIVE_THRESH’ was not declared in this scope错误
- Windows文件删不掉:无法设置新所有者
- win10 Go语言下载与安装
- 上古卷轴python_瑞云动态