题目描述:
数组A,长度为n,其中A[0, m-1] 和 A[m, n-1],都分别有序。将其合并成有序数组A[0,n-1],要求空间复杂度为O(1)。
现在的题目条件是数组分段有序,前后两部分已经有序,如果没有空间复杂度的限制,可以通过建立一个长度为n的空间,然后在O(n)时间内归并成一个有序的数组。
(1)直接插入排序
常见的比较排序算法我们都知道,我们知道在已经基本排序的基础上,直接插入排序的效率是比较高的,所以首先我们能想到的就是利用直接插入排序的方法来解决这个问题,时间复杂度T(n) = m*(n-m),这是因为每次确定插入位置时,最多需要比较和移动m次,因为前面已经插入的元素已经是在最终位置上了(A[m, n -1]也是有序的原因)。
具体代码如下:
template <typename Type>
void DirectInsertMerge(Type *array, int low, int high, int m)
{
if (array == NULL || low >= high || low < 0 || m < low || m > high)
{
return;
}
Type exchange;
int j;
for (int i = m; i <= high; ++i)
{
exchange = array[i];
for (j = i - 1; j >= low; --j)
{
if (exchange < array[j])
{
array[j + 1] = array[j];
}
else
{
break;
}
}
if( i == j + 1) break;//插入位置为当前所在位置,整个数组已经有序
array[j + 1] = exchange;
}
}
(2)另一种解法
将A[m]与A[0...m-1]的元素依次顺序比较,当A[m] < A[i]时,将A[m]<--->A[i]进行交换,然后对A [m...n - 1]进行重新排序使其有序(可采用直接插入),然后依次重复上述步骤,不过是A[m]与A[i+1...m-1]的元素依次顺序比较。因为i前面的元素已经在起该在的位置上了。如下图:
这种算法的时间复杂度和直接插入排序一样,T(n) = m*(n-m),源代码如下:
template <typename Type>
void MergePartialSeq(Type *array, int low, int high, int m)
{
if (array == NULL || low >= high || low < 0 || m < low || m > high)
{
return;
}
Type exchange;
int i = low;
while( i < m)
{
while (i < m && array[m] >= array[i])
++i;
if(i == m)
break;
exchange = array[i];
array[i] = array[m];
array[m] = exchange;
int j = m + 1;
exchange = array[m];
while(j <= high && array[j] < exchange)
{
array[j - 1] = array[j];
++j;
}
array[j - 1] = exchange;
++i;
}
}
May 28, 2013 @lab
分享到:
相关推荐
分段连续数字跳号查找
数学建模,绘制分段函数曲线并添加图形标注,很不错的哦
matlab开发-分段工具用于分段图像的交互式组合。以交互方式找到分割(遮罩)图像的最佳方法
提出了一种新的固定分段数的表示方法——PLR_BTBU,首先根据二叉树层次遍历的思想,提取时间序列全局特征点将时间序列初始分段,再通过斜率变化特征将整个时间序列符号化,以各初始分段内的符号特征来确定各初始分段...
(1)首先分配一片较大的内存空间,作为程序运行的可用存储空间; (2)建立应用程序的模型,应该包括相应的分段描述与存储结构; (3)建立进程的基本数据结构及相应算法 (4)建立管理存储空间的基本存储结构...
代码 分段线性插值算法代码代码 分段线性插值算法代码代码 分段线性插值算法代码代码 分段线性插值算法代码代码 分段线性插值算法代码代码 分段线性插值算法代码代码 分段线性插值算法代码代码 分段线性插值算法代码...
js rsa加密 分段 使用时encrypt 方法名别忘了变为encryptLong
在 MATLAB 中实现的分段线性回归算法。它使用动态规划来找到成本最低的线段集(误差平方和 + λ × 线段数) 怎么运作 按x坐标对点进行排序。 计算最左边和最右边点的每个组合的回归参数(b0, b1)和误差平方和。 ...
一个长信号进行分析时,可能需要对信号分段,本程序提供一种分段方法
在该Demo中,有一个分段标头(section header)随列表滚动,当前分段标头一直显示在屏幕顶端。在下图中,突出显示的字母就是分段标头,其下方的列表项显示首字母与分段标头相同的国家。
android 视频分段录制,分段删除,最后合成一个mp4分件。使用的技术为MediaRecorder和mp4parser。运行完美,只要稍作打磨即可商业化应用
提交数: 31843 通过数: 18270 【题目描述】 编写程序,计算下列分段函数y=f(x)的值。结果保留到小数点后三位。 y=−x+2.5;0≤x y=2−1.5(x−3)(x−3);5≤x y=x2−1.5;10≤x 【输入】 一个浮点数N(0≤N)。 ...
IP分段划分
C# FileStream 分段读取文本内容C# FileStream 分段读取文本内容C# FileStream 分段读取文本内容C# FileStream 分段读取文本内容
论文研究-带分段仓储能力决策的动态批量优化...利用分解技术和几何技术,本文开发一个计算复杂度为O(T3)的动态规划算法.计算测试显示,该算法与求解混合整数规划(MIP)的商业软件相比,在计算时间上具有明显的优势.
IOS RSA加密 分段解密
分段法素数生成
matlab分段灰度线性变换代码
本库主要提供一个简单易用的自定义分段控件,方便快速实现分段效果,支持xml配置、代码配置、分段规则按均分/比例分、数字分段、文本分段、渐变分段、bar条样式正常/圆形/三角形,segment文字样式、进度设置、进度...