题目:设计一个高效的算法,将顺序表的所有元素逆置,要求算法的空间复杂度为O(1)。
算法思想:扫描顺序表的前半部分元素,对于元素L.data[i] (0<=i<L.length/2),将其余后半部分对应元素L.data[L.lengtn-i-1]进行交换。
空间复杂度:
算法的空间复杂度S(n),定义为该算法所耗费的存储空间,它是问题规模n的函数。渐近空间复杂度也常简称为空间复杂度,记作S(n)=O(g(n))。
一个上机程序除了需要存储空间来存放本身所用指令、常数、变量和输入数据外,也需要一些对数据进行操作的工作单元和存储一些为实现计算所需信息的辅助空间,若输入数据所占空间只取决于问题本身,和算法无关,则只需分析除输入和程序之外的额外空间。
算法原地工作是指算法所需辅助空间是常量,即O(1)。
自己写的核心代码(算法):
void Reverse_Sq(LIST *list)
{
int p;
int i = 0;
int j = list->length - 1;
while (i<list->length / 2 && j>=list->length / 2)
{
p = list->base[i];
list->base[i] = list->base[j];
list->base[j] = p;
i++;
j--;
}
我这里用到了i和j两个变量,参考答案只用到了i就可以实现,是根据上述算法思想写的,可以参考上述算法思想来实现。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define N 8
typedef struct
{
int * base;
int length;
int listsize;
}LIST;
void Init_LIST(LIST* list)
{
list->listsize = 100;
list->base = (int*)malloc(list->listsize*sizeof(int));
list->length = 0;
}
void Reverse_Sq(LIST *list)
{
int p;
int i = 0;
int j = list->length - 1;
while (i<list->length / 2 && j>=list->length / 2)
{
p = list->base[i];
list->base[i] = list->base[j];
list->base[j] = p;
i++;
j--;
}
}
int main()
{
LIST mylist;
Init_LIST(&mylist);
printf("请输入mylist里数据:\n");
for (int i = 0; i < N; i++)
{
scanf("%d", &mylist.base[i]);
mylist.length++;
}
Reverse_Sq(&mylist);
printf("请输出mylist里数据:\n");
for (int i = 0; i < N; i++)
{
printf("%d ", mylist.base[i]);
}
}