您的位置:首页 > 编程语言 > C语言/C++

C语言合并两个有序数组,时间复杂度为O(n),空间复杂度O(1)

2017-12-26 15:54 471 查看
#include<stdio.h>
#include<string.h>

/*
func: 合并两个有序数组
arrSrc:将另一有序数组arrDest合并至该数组
arrDest:将该数组合并至另一有序数组arrSrc
captionSrc:arrSrc的容量大小,保证能保存arrSrc + arrDest
lenSrc:arrSrc数组的现有有效元素个数
lenDest:arrDest数组的现有有效元素个数
 */
void mergeArray(int* arrSrc, int* arrDest,int captionSrc,int lenSrc, int lenDest)
{
if(NULL == arrSrc || NULL == arrDest || ((lenSrc + lenDest) > captionSrc)) {
return;
}

 int indexOfNew = lenSrc + lenDest - 1; //新数组的末位索引
int indexOfSrc = lenSrc - 1;//arrSrc有效元素的末位索引
int indexOfDest = lenDest - 1;//arrDest有效元素的末位索引

//当arrDest全部扫描完成,元素全部插入arrSrc,剩余arrSrc元素不需要移位操作
//当arrSrc全部遍历完成,但arrDest仍有元素时,只需要操作arrDest即可,此时arrSrc下标已达最小值0

 while (indexOfDest >= 0) {
if (indexOfSrc >= 0){
//将arrSrc或arrDest中较大的元素放入arrSrc新位置,同时移动变化数组的指针位置
 if (arrSrc[indexOfSrc] >= arrDest[indexOfDest]) {
arrSrc[indexOfNew] = arrSrc[indexOfSrc];
--indexOfNew;
--indexOfSrc;
}else{
arrSrc[indexOfNew] = arrDest[indexOfDest];
--indexOfNew;
--indexOfDest;
}
} else {
arrSrc[indexOfNew] = arrDest[indexOfDest];
--indexOfNew;
--indexOfDest;
}
}

}
int main(void)
{
int arrSrc[100] = {1,1,1,1,1,1,3,5,7,9};
int arrDest[6] = {2,4,6,8,10,12};
mergeArray(arrSrc, arrDest, 100, 10, 6);
printf("after merge ,arrSrc is:\n");
for(int i = 0; i < 16; ++i) {
printf("%d ",arrSrc[i]);
}
printf("\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐