您的位置:首页 > 理论基础

合并两有序数组 时间O(n) 无辅助空间

2015-10-27 17:45 260 查看
题目来自《计算机算法设计与分析》王晓东第四版
原题重述:
设子数组a[0:k-1]和a[k:n-1]已经排好序(0<=k<=n-1)。试设计一个合并这两个子数组为排好序的数组a[0:n-1]的算法。要求算法在最坏的情况下所用的计算时间为O(n),而且只用到O(1)的辅助空间。
基本思路:  设A={a1, a2,...,ai,bi+1,bi+2,...,bn}  定义三个指针left(指向数组前部分) right(指向数组后部分)mid(left和right交换以后生成的新序列)。  序列将分成三部分,三个指针负责把三个序列中的最小值有序的放在数组的前部分,left指针从头至尾遍历一边。此过程中会有以下几种情况:   1.left最小:left<mid<right和left<right<mid,最理想的情况,此时mid和right指针位置不变,left指针自增向后遍历。   2.right最小:right<mid<left和right<left<mid,此时right值最小,right和left互换,将最小值right放在序列前部分。left和right指针同时自增,mid位置不变。   3.mid最小:mid<left<right和mid<right<left,此时mid最小,将mid和left互换,最小值mid放在序列前部分。mid和left指针同时自增,right位置不变。   4.其他情况不予考虑。   算法停止条件:left=right指针。   算法时间复杂度为O(n),无辅助空间。实例演示:有空再写实现代码:暂无本文章为个人原创,转载或引用请注明出处,谢谢。
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息