1. 设计一个高效算法,将顺序表中的所有元素逆置,要求算法的时间复杂度为O(n),空间复杂度为O(1)。
(1)算法分析:因为时间复杂度为O(n),所以我们采用一次循环来实现,想要逆置只要依次首尾元素交换即可。
temp=L.a[i];
L.a[i]=L.a[n-i-1];
L.a[n-i-1]=temp;
(2)算法实现:
#define MAXSIZE 100
typedef struct{
ElemType a[MAXSIZE+1];
int n;
}sqlit;
void nizhi(sqlit &L,int i){
int temp=0;
for(i=0;i<n/2;i++){
temp=L.a[i];
L.a[i]=L.a[n-i-1];
L.a[n-i-1]=temp;
}
}
2、 设顺序表L中的数据元素值递增有序。试设计一个算法,将x插入到顺序表L的适当位置上,以保持L的有序性。
(1)算法分析:首先要找到这个元素要插在哪里,也就是它的插入位置,其余就很简单了,就不再叙述了。
for(int i=0;i<L.n;i++){
if(x>L.a[i]&&x<L.a[i+1]){
int flag=i+1; //flag就是元素x要插入的位置
}
(2)算法实现:
#define MAXSIZE 100
typedef struct{
ElemType a[MAXSIZE+1];
int n;
}sqlit;
void charu(sqlit &L,int i,ElemType x){
for(i=0;i<L.n;i++){
if(x>L.a[i]&&x<L.a[i+1]){
for(int j=n;j>=i+1;j++){
L.a[j]=L.a[j-1];
}
L.a[i+1]=x;break;
}
}
}
3、 有一个顺序表L,其元素为整型,设计一个算法将L中所有小于0的整数放在前半部分,大于等于0的整数放在后半部分,要求时间复杂度为O(n)、空间复杂度为O(1).
(1)算法设计:
#define MAXSIZE 100
typedef struct{
ElemType a[MAXSIZE+1];
int n;
}sqlit;
void xuanze(sqlit &L,int i,int j){
for(i=0,j=0;i<l.n;i++){
if(L.a[i]<0){
L.a[j++]=L.a[i];}
flag=j;
}
for(i=0,j=0;i<l.n;i++){
if(L.a[i]>0){
L.a[flag++]=L.a[i];}
}
}