6 . 从有序表中删除所有其值重复的元素,使表中所有元素均不同。
算法思想:相同元素一定在连续的位置上,所以如果不同则插入到前面所有非重复的有序表的最后。
void Del_All__Du(SqList &L)//Delete all Duplicate
{
int temp = L.data[0], count = 0;
for (int i = 1; i < L.length; i++)//{ 1, 1, 2, 3, 4, 4, 5, 6, 6 }
{
if (L.data[i] == temp)
{
count++;
}
else
{
temp = L.data[i];
}
L.data[i - count] = L.data[i];
}
L.length -= count;
}
7 . 将两个有序表合并成一个新的有序线性表,并由函数返回结果顺序表。
算法思想:按顺序不断取下两个顺序表头较小的节点存入新的顺序表,然后剩下的加到新表的后面。
void Merge(SqList A,SqList B,SqList &C)
{
int count = 0;
int i = 0, j = 0;
while (i < A.length&&j < B.length)
{
if (A.data[i] <= B.data[j])
{
C.data[count++] = A.data[i++];
}
else
{
C.data[count++] = B.data[j++];
}
}
while (i < A.length)
{
C.data[count++] = A.data[i++];
}
while (j < B.length)
{
C.data[count++] = B.data[j++];
}
C.length = count;
}
8 . 已知在一维数组A[m+n]中依次存放着两个线性表(a1,a2,a3,…,am)和(b1,b2,b3,…,bn),试编写一个函数,将数组中两个顺序表互换,即将(b1,b2,b3,…,bn)放在(a1,a2,a3,…,am)的前面。
算法思想:将两个线性表分别转置,再将A转置。
void Reverse(SqList &A,int a,int b)
{
int mid = (a + b + 1) / 2;
for (int i = 0; i < mid-a; i++)
{
int temp = A.data[b - i];
A.data[b - i] = A.data[a + i];
A.data[a + i] = temp;
}
}
9 . 线性表(a1,a2,a3,…,an)中元素递增有序,且按顺序存储于计算机内。要求设计一算法完成用最少时间在表中查找数据值为x的元素;若找到,将其与后继元素位置交换;若找不到将其插入到表中,使表中的元素仍递增有序。
算法思想:折半查找
bool SearchExchangeInsert(SqList &A,int x)
{
int low = 0, high = A.length - 1, i;
int mid = (low + high) / 2;
int temp = 0;
while (low < high)
{
if (A.data[mid] == x&&mid != A.length - 1)
{
temp = A.data[mid];
A.data[mid] = A.data[mid + 1];
A.data[mid + 1] = temp;
return true;
}
else if (A.data[mid] >= x)
{
high = mid - 1;
mid = (low + high) / 2;
}
else
{
low = mid + 1;
mid = (low + high) / 2;
}
}
for (i = A.length - 1; i > high; i--)
{
A.data[i + 1] = A.data[i];
}
A.data[i + 1] = x;
A.length++;
return true;
}
10 .一个长度为L(L ≥1) 的升序序列S,处在第 L/2 个位置的数称为S的中位数。例如,若序列S1=(11,13,15,17,19),则S1的中位数是15;
两个序列的中位数是含它们所有元素所组成的升序序列的中位数。例如,若S2=(2,4,6,8,20),则S1和S2的中位数是11。
现在有两个等长升序序列A和B,试设计一个在时间和空间都尽可能高效的算法,找出两个序列A和B的中位数。
算法思想:如果S1[L/2]大于S2[L/2],则在S1[L/2]前半截中再找中位数,S2[L/2]后半截找中位数。etc.
int FindMid(int A[], int B[])
{
int s1=0,d1=MaxSize-1,m1;
int s2=0,d2=MaxSize-1,m2;
while(s1!=d1||s2!=d2){
m1=(s1+d1)/2;
m2=(s2+d2)/2;
if(A[m1]<B[m2]){
if((s1+d1)%2==0){
s1=m1;
d2=m2;
}else{
s1=m1+1;
d2=m2;
}
}else if(A[m1]>B[2]){
if((s2+d2)%2==0){
d1=m1;
s2=m2;
}else{
d1=m1;
s2=m2+1;
}
}else{
return A[m1];
}
}
return A[s1]<B[s2]?A[s1]:B[s2];
}