(2021)2.2设计一个高效算法,将顺序表L的所有元素逆置,要求算法的空间复杂度为O(1)。
1.定义顺序表
#define MaxSize 50
typedef struct{
int data[MaxSize];
int length;
}SqList;
2.初始化顺序表
取地址符号在练习2.1中有相应解释,在此不做赘述。
void InitList(SqList *L){
for (int i=0,j=1; i<10; i++,j++){
L->data[i] = j;
L->length++;
}
}
3.在main函数中传入地址
int main(){
SqList L;
L.length = 0;
InitList(&L);
for(int i=0; i<L.length; i++){
printf("data[%d]=%d\n",i,L.data[i]);
}
printf("length = %d\n",L.length);
ListReverse(&L);
for(int i=0; i<L.length; i++){
printf("data[%d]=%d\n",i,L.data[i]);
}
printf("length = %d\n",L.length);
return 0;
}
4.将顺序表中元素逆置
在同一顺序表中进行操作,设置一转换值temp,不需另开辟空间,保证空间复杂度为O(1)。
从顺序表两端同时进行操作,表头元素赋值给temp,将表尾元素调换到表头位置,最后将temp中的表头元素填入表尾空出位置,完成元素逆置。
此方法时间复杂度为O(length/2),即O(n)。
void ListReverse(SqList *L){
int 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;
}
}
5.整体代码以及运行结果
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 50
typedef struct{
int data[MaxSize];
int length;
}SqList;
void InitList(SqList *L){
for (int i=0,j=1; i<10; i++,j++){
L->data[i] = j;
L->length++;
}
}
void ListReverse(SqList *L){
int 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;
}
}
int main(){
SqList L;
L.length = 0;
InitList(&L);
for(int i=0; i<L.length; i++){
printf("data[%d]=%d\n",i,L.data[i]);
}
printf("length = %d\n",L.length);
ListReverse(&L);
for(int i=0; i<L.length; i++){
printf("data[%d]=%d\n",i,L.data[i]);
}
printf("length = %d\n",L.length);
return 0;
}