当前位置: 首页 > news >正文

排序----归并排序(非递归版)

如图代码为11归并的示例,用for循环来解决。

每一次往前递归的前一小部分内部已经是有序的了。

但是我们测试的时候会发现这样一个问题,begin和end的值会存在越界的问题,而且只有begin1不会越界,因为begin1是受for循环中i的控制的。

所以当我们遇到begin越界了就不用管了,遇到end越界就修正一下

注意:每归并一组都要拷贝回去,因为:

这种情况下,只有前两组归并了,但是后两组没有归并,如果是全都归并完了再整体拷贝,那么原数组中的8 9会被覆盖,就产生丢失数据的问题了。

完整代码如下:

void MergeSortNonR(int* a, int n)
{int* tmp = (int*)malloc(sizeof(int) * n);if (tmp == NULL){perror("malloc fail");return;}// gap每组归并数据的数据个数int gap = 1;while (gap < n){for (int i = 0; i < n; i += 2 * gap){// [begin1, end1][begin2, end2]int begin1 = i, end1 = i + gap - 1;int begin2 = i + gap, end2 = i + 2 * gap - 1;printf("[%d,%d][%d,%d] ", begin1, end1, begin2, end2);// 第二组都越界不存在,这一组就不需要归并if (begin2 >= n)break;// 第二的组begin2没越界,end2越界了,需要修正一下,继续归并if (end2 >= n)end2 = n - 1;int j = i;while (begin1 <= end1 && begin2 <= end2){if (a[begin1] < a[begin2]){tmp[j++] = a[begin1++];}else{tmp[j++] = a[begin2++];}}while (begin1 <= end1){tmp[j++] = a[begin1++];}while (begin2 <= end2){tmp[j++] = a[begin2++];}memcpy(a + i, tmp + i, sizeof(int) * (end2 - i + 1));}printf("\n");gap *= 2;}free(tmp);tmp = NULL;
}


http://www.mrgr.cn/news/35202.html

相关文章:

  • YOLO11 旋转目标检测 | OBB定向检测 | ONNX模型推理 | 旋转NMS
  • MyBatis-Plus快速上手
  • Leetcode:118. 杨辉三角——Java数学法求解
  • 解锁微前端的优秀库
  • WPF-控件的属性值的类型转化
  • css-50 Projects in 50 Days(4)
  • 美团外卖霸王餐系统有哪些优势?如何选择?
  • 浙大数据结构:05-树9 Huffman Codes
  • 4款思维导图在线工具,新手速来!
  • chatGPT问答知识合集【五】
  • 【CPP11?】结合CPP发展历史来理解CPP11
  • 掌握Python办公自动化,轻松成为职场高效达人
  • 特殊类设计
  • 一步一步优化一套生成式语言模型系统
  • 二分查找算法(8) _点名
  • Solidity——抽象合约和接口详解
  • 【python】数据类型
  • WebRtc实际应用
  • 【数学二】极限的计算- 等价无穷小替换、洛必达法则求极限
  • 找不到MFC140.dll无法继续执行代码怎么办,共有6种解决方法
  • 离线一机一码验证和网络验证的区别以及使用场景
  • Figma 中要放大并下载 UI 设计中的图标
  • 如何利用 Kafka,实时挖掘企业数据的价值?
  • 基于Ambari搭建大数据分析平台(30分钟速成)全网最全最详细的Ambari搭建大数据分析平台:
  • (13)mysql慢查询常用语句
  • 船只类型识别系统源码分享