1.顺序表用A[]表示,总长m+n,前m个元素有序递增,后n个元素有序递增
设计一个算法使A[]整体有序递增,并分析时间和空间复杂度
//思路,从下标 A(m,m+n-1) 中依次处理,与该元素前所有元素进行比较,比较途中完成移动,找到合适位置进行插入
void insertElem(int A[], int m, int n)
{
int i = m;
int temp;
for (i; i < m + n; ++i) //从下标 A(m, m + n - 1) 中依次处理
{
temp = A[i]; //记录当前处理的元素
int j = i-1;
while (j >= 0 && temp < A[j]) //与该元素前所有元素进行比较,比较途中完成移动,找到合适位置进行插入
{
A[j+1] = A[j]; //后移一位元素
--j;
}
A[j+1] = temp; //因为最后不满足条件时还进行了一次 --j
}
}
2.逆置问题
1)将一长度为n的数组前端k(k<n)个元素逆序后移动到数组后端,其他数据不丢失即可
// m=0,n=A.size()-1 即逆序整个数组即可
void reverse(int A[],int m,int n)
{
int i = m;
int j = n;
while (i < j)
{
int temp=A[i];
A[i] = A[j];
A[j] = temp;
++i;
--j;
}
}
2)将一长度为n的数组前端k(k<n)个元素保持原序后移动到数组后端,其他数据不丢失即可
//伪码: 先将前k个元素逆序,再逆序整个数组即可
void main()
{
reverse(A,0,k-1);
reverse(A,0,A_size()-1);
}
3)将数组中元素(X0,X1…Xn)移动p个位置,移动后数组中元素为(Xp,Xp+1…Xn,X0,X1…Xp-1)
//伪码: 先将前p-1个元素逆序,再将(p,n)的元素逆序,最后逆序整个数组即可
void main()
{
reverse(A,0,p-1);
reverse(A,p,A_size()-1);
reverse(A,0,A_size()-1);
}