/** mergesort_unrecursive.cpp**  Created on: Dec 14, 2011*      Author: junfeng*//从分治策略的机制入手,容易消除归并排序算法中的递归,事实上,//算法Mergesort的递归过程只是将待排序列 集合一分为二,直到待排序列集合//只剩下一个元素为止,然后不断合并两个排好序的数组段。按此机制,可以首先//将数组a中相邻元素两两配对。用合并算法将它们排序,构成n/2组长度为2的排好//序的子数组段,然后再将它们 排序成长度为4的排好序的子数组段,如此继续下去,//直至整个数组排好序。这就是自然合并排序的思想。对于n元数组已排好序情况//自然排序算法不执行合并,而算法mergesort需执行[logn]次合并。***/#ifndef MERGESORT_UNRECURSIVE_
#define MERGESORT_UNRECURSIVE_#include<stdio.h>void mergesort_unrecursive(int* a, const int n);
void print(int const * a, const int n);int main()
{int a[] = { 1, 3, 2, 4, 5, -1, 0, -2, -3, -4, -5 };int len = sizeof(a) / sizeof(*a);print(a, len);mergesort_unrecursive(a, len);print(a, len);return 0;
}
void mergesort_unrecursive(int* a, const int n)
{int* b = new int[n];int len = 1;while (len < n){/** 初始len==1*/int start = 0;int end = start + len;int k, start_max, end_max;while (start < n){start_max = start + len;end_max = end + len;/** 处理一个小于len片断的情况*/if (start_max > n)break;//结束当前len的一次merge/** 处理最后一个长度len和小于len的两个片断*/if (end_max > n)end_max = n;////            printf("start=%d\n", start);//           printf("start_max=%d\n", start_max);//           printf("end=%d\n", end);//           printf("end_max=%d\n", end_max);//复制merge的部分for (int i = start; i < end_max; i++)b[i] = a[i];/** end==start+len;* merge [start,end]*        [end,end+len]*/k = start;while (start < start_max && end < end_max){if (b[start] < b[end])a[k++] = b[start++];elsea[k++] = b[end++];}while (start < start_max)a[k++] = b[start++];while (end < end_max)a[k++] = b[end++];/** 下2个len的片断*/start = end_max;//这个开始错写尾s=end+len;end = start + len;//          printf("len=%d\n", len);//           printf("a=");//          print(a, n + 1);}len = len * 2;//开始错误:没有这句}delete[] b;
}
void print(int const * a, int const n)
{for (int i = 0; i < n; i++)printf("%d ", a[i]);printf("\n");
}
#endif //MERGESORT_UNRECURSIVE_

转载于:https://www.cnblogs.com/fengjunfeng/archive/2011/12/14/2797782.html

mergesort unrecursive 归并排序的非递归实现相关推荐

  1. 排序算法杂谈(三) —— 归并排序的非递归实现

    1. 递归 在众多排序算法中,归并排序(Merge Sort)和快速排序(Quick Sort)都是时间复杂度为 O(nlog2n) 的高效排序. 这两种排序有一种共性,就是运用到了递归的思想. 在程 ...

  2. 计算机算法设计与分析 递归实现归并排序和非递归实现归并排序

    递归实现归并排序 输入排序的数组的长度,程序用随机数生成对应的数组,之后递归调用排序,排序过程中思想类似于二分,当每个最小分组中只有一个元素时开始返回,直到排完整个数组. #include<bi ...

  3. 【Java】 归并排序的非递归实现

    归并排序可以采用递归方法(见:归并排序),但递归方法会消耗深度位O(longn)的栈空间,使用归并排序时,应该尽量使用非递归方法.本文实现了java版的非递归归并排序. 更多:数据结构与算法合集 思路 ...

  4. 手把手教你归并排序(非递归)

    今天,我们一起来学习归并排序的非递归算法吧! 目录 一.优势 二.实现原理 三.代码实现 一.优势 相比于递归算法,归并排序的非递归算法不用多次调用同一个函数,不会向递归算法一样因为函数嵌套调用次数太 ...

  5. 归并排序(递归实现+非递归实现+自然合并排序)

    归并排序的确是分治思想的经典代表.写了很多次,这次又有新的收获,过去用的是递归的实现方式,理论上任何用递归方法实现的代码都可以转换为非递归的形式,所以此例也不例外.然后再用非递归的实现方法上进行改进, ...

  6. 归并排序详解(递归+非递归)

    目录 归并排序 归并排序的思想 递归实现 非递归实现 归并排序 归并排序和之前讲的快速排序.希尔排序.堆排序一样,时间复杂度是O(N*logN). 它相对难理解一点,接下来我就从递归以及非递归两个方面 ...

  7. 归并排序(递归+非递归)

    目录 一.什么是归并排序? 二.归并排序(递归) 三.归并排序(非递归) 一.什么是归并排序? 归并排序,是创建在归并操作上的一种有效的排序算法.算法是采用分治法(Divide and Conquer ...

  8. 快速排序和归并排序中一趟的理解(递归和非递归)

    引:2019年408中数据结构一道考察快速排序的选择题 答案:D 定位:这道题在考察快速排序中一趟的概念.注意,基本的冒泡,插入,选择排序的一趟概念很容易理解, 接下来我们要讨论的是递归排序算法中(本 ...

  9. mergesort java_归并排序详解(MergeSort)递归和非递归实现

    归并排序的概念及定义 归并排序(Merge)是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列. 归并排序是建立 ...

  10. (C++)归并排序的递归与非递归实现

    递归实现 merge函数利用的是双指针技巧降低复杂度. mergeSort函数使用了递归,当中先对左右序列各调用一次mergeSort,再对整个序列调用merge.就按照最浅层的归并的思想去理解,不要 ...

最新文章

  1. IBM借QISKit打造基于云平台的量子计算
  2. 霍布森选择效应(Hobson choice Effect)
  3. MFC 不存在从 CString 到 char * 的适当转换函数
  4. Spring Security原理与应用
  5. [vs2010 project] CppUnit快速入门
  6. LeetCode 1776. 车队 II(单调栈)
  7. 鼬电脑壁纸_火影忍者高清壁纸需要自取1080p
  8. ios app被自己从应用商店下架后可以再恢復上架吗
  9. django中设置url或者models中的slug字段
  10. HDU-1045 Fire NetFire Net 最大团
  11. JDK 1.8 新特性学习(Stream)
  12. CSS/HTML/JS
  13. c语言经典题100及答案,100个经典c语言例题(带答案)
  14. 3dmax中如何导出多个动画
  15. app如何控制手机横屏
  16. phpstorm配置phpunit单元测试及PHPunit断言函数
  17. Unreal4 入门
  18. 基于stc51单片机的指纹解锁模块
  19. 关于微信防撤回(文本、图片、语音、视频、名片等...)的Python学习教程
  20. JEECG3.3.0 配置大鱼短信

热门文章

  1. ajax获取inputname值,jQuery - 获取ajax POST的表单值
  2. 全网疯传的PDF干货合集,50个精选BAT等大厂大数据、算法落地经验,白拿不谢!...
  3. 如何用5年时间从菜鸟成长为技术总监?
  4. Android Multimedia框架总结(十三)CodeC部分之OpenMAX框架初识及接口与适配层实现
  5. 微型计算机期末总结卷首语,个人总结卷首语.doc
  6. java并发程序死锁检测_Java并发:隐藏的线程死锁
  7. linux监控文件是否传输,利用SecureCRT在linux与Windows之间传输文件
  8. php数组合成函数,PHP合并数组函数array_merge用法分析
  9. PyQt+QtDesigner及相关插件的安装和设置
  10. JS实现报表标题动态滚动效果