首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

关于排列的有关问题,希望高手指教!

2012-03-26 
关于排列的问题,希望高手指教!!!!!!一个数组a[0:n-1],分为前后两部分a[0:k]和a[k+1:n-1],且两个数组中的数

关于排列的问题,希望高手指教!!!!!!
一个数组a[0:n-1],分为前后两部分a[0:k]和a[k+1:n-1],且两个数组中的数均已经从小到大排列好了,现在要将它们合并在一起,要求时间复杂度最坏的情况是O(n),空间复杂度为O(1).
是算法设计上的一道题目,请高手指教.希望给出代码或思路!!!

[解决办法]
两路归并算法

1、算法基本思路
 设两个有序的子文件(相当于输入堆)放在同一向量中相邻的位置上:R[low..m],R[m+1..high],先将它们合并到一个局部的暂存向量R1(相当于输出堆)中,待合并完成后将R1复制回R[low..high]中。

(1)合并过程
 合并过程中,设置i,j和p三个指针,其初值分别指向这三个记录区的起始位置。合并时依次比较R[i]和R[j]的关键字,取关键字较小的记录复制到R1[p]中,然后将被复制记录的指针i或j加1,以及指向复制位置的指针p加1。
 重复这一过程直至两个输入的子文件有一个已全部复制完毕(不妨称其为空),此时将另一非空的子文件中剩余记录依次复制到R1中即可。

(2)动态申请R1
 实现时,R1是动态申请的,因为申请的空间可能很大,故须加入申请空间是否成功的处理。

2、归并算法
void Merge(SeqList R,int low,int m,int high)
{//将两个有序的子文件R[low..m)和R[m+1..high]归并成一个有序的
//子文件R[low..high]
int i=low,j=m+1,p=0; //置初始值
RecType *R1; //R1是局部向量,若p定义为此类型指针速度更快
R1=(ReeType *)malloc((high-low+1)*sizeof(RecType));
if(! R1) //申请空间失败
Error( "Insufficient memory available! ");
while(i <=m&&j <=high) //两子文件非空时取其小者输出到R1[p]上
R1[p++]=(R[i].key <=R[j].key)?R[i++]:R[j++];
while(i <=m) //若第1个子文件非空,则复制剩余记录到R1中
R1[p++]=R[i++];
while(j <=high) //若第2个子文件非空,则复制剩余记录到R1中
R1[p++]=R[j++];
for(p=0,i=low;i <=high;p++,i++)
R[i]=R1[p];//归并完成后将结果复制回R[low..high]
} //Merge
[解决办法]
这个也算空间复杂度为o(1)么?
[解决办法]
以及:
http://student.zjzk.cn/course_ware/data_structure/web/paixu/paixu8.5.1.2.htm
and
http://student.zjzk.cn/course_ware/data_structure/web/paixu/paixu8.5.1.3.htm
[解决办法]
如果是链表的话,空间复杂度应该是O(1),但是如果是数组的话,空间复杂度是O(n)
[解决办法]
如果是采用链表存储的话直接归并就可以了,时间空间复杂度都满足条件

热点排行