综合题
- 【2010】设将 n(n > 1)个整数存放到一维数组 R 中,设计一个在时间和空间两方面都尽可能高效的算法。将 R 中保存的序列循环左移 p (0 < p < n)个位置,即将 R 中的数据由(X0,X1,…,Xn-1)变换为(Xp,Xp+1,…,Xn-1,X0,X1,…,Xp-1)。
算法思想:使用逆置函数,对于将 ab 变为 ba 的过程,先对a 逆置得到 a^-1 然后对 b 逆置得到 a^-1 b^-1,最后将整个 部分逆置,(a^-1,b^-1)^-1 = ba。
void Reserve(int R[], int form, int to) {
int i, temp;
for (i = 0; i < (to - form) / 2; i++) {
temp = R[form + i];
R[form + i] = R[to - i];
R[to - i] = temp;
}
}
void Converse (int R[], int n, int p) {
Reservr(R, 0, p - 1);
Reserve(R, p, n - 1);
Reserve(R, 0, n - 1);
}
- 【2011】长度 L 的升序序列 S,[L / 2] 称为中位数,两序列中位数是他们所含元素升序的中位数。现有 等长两个升序序列 A 和 B,设计一个算法找出 A、B 中位数。
算法思想:分别求出两升序序列的中位数,分别设为 a,b,作比较。若 a = b ,则就是两序列中位数。若不相等则舍弃较大中位数序类中的大于中位数的元素,同时舍弃较小中位数中小于中位数的元素。将剩余元素按照升序排列,再次对其求中位数,重复上述过程,直到两序列中仅含有一个元素,较小元素为所求中位数。
int M_Search (int A[], int B[], int n) {
itn s1 = 0, d1 = n - 1, m1, s2 = 0, d2 = n - 1, m2;
//分别代表序列a,b的首位数、末位数和中位数;
while (s1 != d1 || s2 != d2) {
m1 = (s1 + d1) / 2;
m2 = (s2 + d2) / 2;
if (A[m1] == B[m2])
return A[m1];
if(A[m1] < B[m2]) {
if ((s1 + d1) % 2 == 0) {
s1 = m1;
d2 = m2;
}
else {
s1 = m1 + 1;
d2 = m2;
}
else {
if ((m2 + d2) % 2 == 0) {
if ((s1 + d1) % 2 == 0) {
d1 = m1;
s2 = m2;
} else {
d1 = m1;
s2 = m2 + 1;
}
}
}
}
}
return A[s1] < B[s2] ? A[s1] : B[s2];
}