设m+n个元素顺序存放在数组A[1…m+n]中,前m个元素递增有序,后n个元素递增有序,试设计一个在时间和空间两方面都尽可能高效的算法,使得整个顺序表递增有序。
把数组A看作是两个长度分别为m和n的有序表L1、L2,把L2的每个元素依次插入到L1中的合适位置即可。
时间复杂度:O(mn)
空间复杂度:O(1)
时间复杂度:O(m+n)
空间复杂度:O(m+n)
#include
void solution1(int *A, int m, int n){
int tmp, j;
for(int i = m+1; i <= m+n;i++){
tmp = A[i];//暂存元素,防止后面移动元素时,元素丢失
for(j = i-1;j > 0 && A[j] > tmp;j--)//当L1中的元素大于tmp时,就是插入tmp的位置
A[j+1] = A[j];
A[j+1] = tmp;
}
}
void print(int* A, int n){
for(int i = 0;i < n;i++)
{
printf("%d ", A[i]);
}
printf("\n");
}
int main(){
int A[] = {0, 1,4,7,2,3,6};
solution(A, 3, 3);
print(A, sizeof(A)/sizeof(A[0]));
return 0;
}
#include
void solution2(int *A, int m, int n){
int B[m+n+1];
int k1 = 1, k2 = m+1, k3 = 1;//三个指针
while(k1<=m && k2<= m+ n){//归并,把较小的元素复制到B中
if(A[k1] < A[k2]) B[k3++] = A[k1++];
else B[k3++] = A[k2++];
}
if(k1 > m) //把没有比较完的归并段的剩余元素复制到B中
while(k2 <= m+n) B[k3++] = A[k2++];
if(k2 > m+n)
while(k1 <= m) B[k3++] = A[k1++];
for(int i = 1;i <= m+n;i++){//把数组B复制到数组A中
A[i] = B[i];
}
}
void print(int* A, int n){
for(int i = 0;i < n;i++)
{
printf("%d ", A[i]);
}
printf("\n");
}
int main(){
int A[] = {0, 1,4,7,2,3,6};
solution2(A, 3, 3);
print(A, sizeof(A)/sizeof(A[0]));
return 0;
}