|
问题描述: 设子数组a[0:k]和a[k+1:n-1]已排好序(0<=k<=n-1).试设计一个合并这两个子数组为排好序的数组a[0:n-1]的算法.要求算法在最坏的情况下所用的计算时间为O(n), 且只用到O(1)的辅助空间.
这一题比较简单,看代码就知道了.
#include <stdio.h>
![](/Images/OutliningIndicators/None.gif)
void DisplayArray(int *pArray, int nLen)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](/Images/OutliningIndicators/ContractedBlock.gif) {
for (int i = 0; i < nLen; ++i)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
printf("array[%d] = %d\n", i, pArray[i]);
}
}
![](/Images/OutliningIndicators/None.gif)
// pArray1和pArray2是已经排好序的数组,要求将它们按照顺序合并到pArray中
// 排序之后的数组不会有重复的元素
void MergeArray(int *pArray1, int nLen1, int *pArray2, int nLen2, int *pArray)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](/Images/OutliningIndicators/ContractedBlock.gif) {
int i, j, n;
![](/Images/OutliningIndicators/InBlock.gif)
i = j = n = 0;
while (i < nLen1 && j < nLen2) // 循环一直进行到拷贝完某一个数组的元素为止
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
if (pArray1[i] < pArray2[j]) // 拷贝array1的元素
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
pArray[n++] = pArray1[i++];
}
else if (pArray1[i] > pArray2[j]) // 拷贝array2的元素
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
pArray[n++] = pArray2[j++];
}
else // 相等的元素拷贝
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
pArray[n++] = pArray2[j++];
++i;
}
}
![](/Images/OutliningIndicators/InBlock.gif)
if (i == nLen1) // 如果array1已经被拷贝完毕就拷贝array2的元素
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
while (j < nLen2)
pArray[n++] = pArray2[j++];
}
else // 如果array2已经被拷贝完毕就拷贝array1的元素
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
while (i < nLen1)
pArray[n++] = pArray1[i++];
}
}
![](/Images/OutliningIndicators/None.gif)
int main()
![](/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](/Images/OutliningIndicators/ContractedBlock.gif) {
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) int array1[] = {1, 4, 5, 7};
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) int array2[] = {2, 3, 6, 8};
int array3[8];
MergeArray(array1, 4, array2, 4, array3);
printf("Merge Array:\n");
DisplayArray(array3, 8);
![](/Images/OutliningIndicators/InBlock.gif)
return 1;
}
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
|