1、設計一個高效算法,將順序表L的所有元素逆置,要求算法的空間複雜度爲O(1)
void Reverse(SqList &L){
ElemType temp;//輔助變量
for(int i=0;i<L.length/2;i++){
temp=L.data[i];
L.data[i]=L.data[L.length-i-1];
L.data[L.length-i-1]=temp;
}
}
2、對於長度爲n的順序表L,編寫一個時間複雜度爲O(n),空間複雜度爲O(1)的算法,該算法刪除線性表中所有值爲x的數據元素。
算法思想:用k記錄順序表L中等於x的元素個數,邊掃描L邊統計k,並將不等於x
的元素前移k個位置,最後修改L的長度
void del_x(SqList &L,ElemType x){
int k=0,i=0;
while(i<L.length){
if(L.data[i]==x){
k++;
}else{
L.data[i-k]=L.data[i];//元素前移k個位置
}
i++;
}
L.length=L.length-k;//L長度減短k
}
3、從順序表中刪除值在s和t之間的所有元素,如果s和t不合理,顯示錯誤信息並退出。
算法思想:從前向後掃描順序表L,用k記錄下元素值在s和t之間的個數,不在s
和t之間的,則前移k個位置
bool del_s_t(SqList &L,ElemType s,ElemType t){
int i,k=0;
if(L.length==0 || s>=t) return false;
for(i=0;i<L.length;i++){
if(L.data[i]>=s && L.data[i]=<t)
k++;
else
L.data[i-k]=L.data[i];//當前元素前移k個位置
}
L.length -= k;
return true;
}
4、從有序的順序表中刪除所有的重複的元素,使得順序表的元素不重複
算法思想: 使用類似於直接排序的思想,初始時將第一個元素視爲非重複的有
序表,之後依次判斷與前面的最後一個元素是否相同。
bool del_same(SqList &L){
if(L.length==0) return false;
int i,j;
for(i=0,j=1;j<L.length;j++){
if(L.data[i]!=L.data[j])
L.data[++i] = L.data[j];
}
L.length=i+1;
return true;
}
5、將兩個有序表合併成一個有序表
算法思想:按順序不斷取下兩個順序表的較小的元素放入新的順序表中,然後
看哪個表有剩餘,將剩餘部分加到新的順序表後面。
bool Merge(SqList A, SqList B, SqList &C){
if(A.length+B.length>C.MaxSize) return false;
int i=0,j=0,k=0;
while(i<A.length && j<B.length){//較小的加入新順序表
if(A.data[i]<=B.data[j]) C.data[k++] = A.data[i++];
else C.data[k++] = B.data[j++];
}
//剩餘加入新順序表
while(i<A.length) C.data[k++] = A.data[i++];
while(j<B.length) C.data[k++] = B.data[j++];
C.length=k;
return true;
}
6、已知在一維數組A[m+n]中依次存放兩個線性表(a1,a2…,am)和(b1,b2…,bn),編寫算法將兩個線性表位置對換成(b1,b2,…bn,a1,a2,…am)
算法思想:先把整個數組反轉逆置成[bn,...b2,b1,am,...a2,a1],再對前n個
和後m個原地逆置。
typedef int DataType;
void Reverse(DataType A[], int left, int right, int arraySize){
if(left>=right || right>=arraySize) return ;
int mid=(left+right)/2;
for(int i=0;i<=mid-left;i++){
DataType temp=A[left+i];
A[left+i]=A[right-i];
A[right-i]=temp;
}
}
void Exchange(DataType A[],int m,int n,int arraySize){
Reverse(A,0,m+n-1,srraySize);
Reverse(A,0,n-1,arraySize);
Reverse(A,n,m+n-1,arraySize);
}