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

归并排序-就地排序

题目要求:对归并排序进行修改,要求合并过程的空间复杂度为O(1)

解题思路:

假设a[beg, mid]和b[mid+1,end]是两段有序的子段,分别记做A和B,现要对其进行合并

1) 首先对A进行搜索,找到比B[0]大的第一个位置,记录为i,即A[0~i-1] < B[0],而A[i] > B[0];

2) 对B进行搜索,找到大于A[i]的第一个位置,记录为j,则B[0~j-1]<B[i]

3) 将A[i,mid], B[0,j-1] 进行旋转,使得B[0,j-1]旋转到左边,得到B[0,j-1] A[i, mid]

4)A[i, mid] B[j, end]是原来问题的一个子问题,继续上述1)-3)的步骤

下面是具体实现的代码:

  1 #include <iostream>
  2 
  3 using namespace std;
  4 
  5  
  6 
  7 void reverse(int *array, int beg, int end)
  8 
  9 {
 10 
 11     while(beg < end)
 12 
 13     {
 14 
 15         int tmp = array[beg];
 16 
 17         array[beg] = array[end];
 18 
 19         array[end] = tmp;
 20 
 21         ++beg;
 22 
 23         --end;
 24 
 25     }
 26 
 27 }
 28 
 29  
 30 
 31 void rotate(int *array, int beg, int end, int len)
 32 
 33 {
 34 
 35     len = len % (end - beg + 1);
 36 
 37     reverse(array, beg, end - len);
 38 
 39     reverse(array, end - len + 1, end);
 40 
 41     reverse(array, beg, end);
 42 
 43 }
 44 
 45  
 46 
 47 void merge(int *array, int beg, int mid, int end)
 48 
 49 {
 50 
 51     int i = beg;
 52 
 53     int j = mid + 1;
 54 
 55     while(i <= end && j <=end && i < j)
 56 
 57     {
 58 
 59         while(i <= end && array[i] < array[j])
 60 
 61         {
 62 
 63             ++i;
 64 
 65         }        
 66 
 67         int k = j;
 68 
 69         while(j <= end && array[j] < array[i])
 70 
 71         {
 72 
 73             ++j;
 74 
 75         }        
 76 
 77         if(j > k)   // 注意这个条件
 78 
 79         {
 80 
 81             rotate(array, i, j-1, j-k);
 82 
 83         }
 84 
 85         
 86 
 87         i += (j -k + 1);
 88 
 89     }
 90 
 91 }
 92 
 93  
 94 
 95 void mergeSort(int *array, int beg, int end)
 96 
 97 {
 98 
 99     if(beg == end)
100 
101         return;
102 
103         
104 
105     int mid = (beg + end) >> 1;
106 
107     mergeSort(array, beg, mid);
108 
109     mergeSort(array, mid + 1, end);
110 
111     merge(array, beg, mid, end);
112 
113 }
114 
115  
116 
117 int main()
118 
119 {
120 
121     int array[] = {8, 7, 6, 5, 4, 3, 2, 1};
122 
123     int beg = 0;
124 
125     int end = sizeof(array) / sizeof(int) - 1;
126 
127     mergeSort(array, beg, end);
128 
129     
130 
131     for(int i=beg; i<=end; ++i)
132 
133     {
134 
135         cout << array[i] << " ";
136 
137     }
138 
139     cout << endl;
140 
141     
142 
143     return 0;
144 
145 }

 

转载于:https://www.cnblogs.com/shirley-ict/p/5158910.html

相关文章:

  • 程序设计第二次作业1
  • 作业一
  • 【数论】关于乘法逆元的证明
  • Python练习:简单停车场(栈)
  • ruby include和exclude区别
  • Javaweb Servlet出现Class xxx is not a servlet错误原因
  • ubuntu 解压
  • Atitit.面向接口的web 原理与设计重写 路由启动绑定配置url router rewriting urlpage  mvc mvp的 java c#.net php js...
  • 【B2B】2015 年B2B的春天
  • php反射方法信息
  • RedHat5.7+ice3.4.2+php5.2.17+nginx1.8.1环境配置
  • ActiveSync 在 Win7(32位) 与 WinCE7 之间使用出现的问题
  • 分别利用(代码,Xib,SB)创建空的App工程
  • oracle 常用存储过程
  • 移动web开发前准备知识了解(html5、jquery)笔记
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • ES6之路之模块详解
  • FastReport在线报表设计器工作原理
  • Git学习与使用心得(1)—— 初始化
  • Java IO学习笔记一
  • java 多线程基础, 我觉得还是有必要看看的
  • Java,console输出实时的转向GUI textbox
  • javascript 哈希表
  • Java新版本的开发已正式进入轨道,版本号18.3
  • Lucene解析 - 基本概念
  • Python3爬取英雄联盟英雄皮肤大图
  • SQL 难点解决:记录的引用
  • Sublime Text 2/3 绑定Eclipse快捷键
  • 大快搜索数据爬虫技术实例安装教学篇
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 记一次用 NodeJs 实现模拟登录的思路
  • 用 Swift 编写面向协议的视图
  • 《天龙八部3D》Unity技术方案揭秘
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​queue --- 一个同步的队列类​
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • # 飞书APP集成平台-数字化落地
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • #预处理和函数的对比以及条件编译
  • (2)Java 简介
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (一) storm的集群安装与配置
  • (转)一些感悟
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .NET 分布式技术比较
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • .NET处理HTTP请求
  • .net打印*三角形
  • ?.的用法
  • [Android] Android ActivityManager
  • [BROADCASTING]tensor的扩散机制
  • [C#]DataTable常用操作总结【转】
  • [ComfyUI进阶教程] animatediff视频提示词书写要点