/// <summary>
/// 数组:线性数据结构,连续的存储空间存储相同数据类型的数据结构
/// 随机访问性:因为数组是连续的内存空间,所以数组具有随机访问性,随机访问的时间复杂度为O(1)
/// 数组的插入,删除操作:相比链表,数据的插入删除操作的时间复杂度在最好的情况下为O(1)【对数组的最后面元素进行操作】,在最坏的情况下O(n)【0~n之间的元素进行操作】
/// 平均时间复杂度为O(n)【计算方式(1+2+3+...+n)/(n)】
/// 原因:数组需要连续的存储空间,所以每次进行插入删除操作时,为了保证数组空间的连续行,都需要进行数据的搬迁
/// 为了提高插入操作的效率,在数组中数组没有规律的情况下,不要求规则的情况下,可以把指定插入的数据元素放在数组的末尾,把要插入的数据元素直接插入到指定的位置
/// 时间复杂度为O(1)
/// 删除操作:在做删除操作的时候,可以先把要删除的位置标记下来,但是并不做删除,不做数据元素的搬迁,待数组中没有足够的空间时,再做删除操作,搬迁数组数据元素
/// 数组的越界问题:数组越界是因为访问了数组受限的内存
/// 数组的动态扩容:在向数组中添加数据元素的时候,数组的内存空间不够,需要扩大数组的内容,然后再将数组中的元素复制到新的数组中
/// 数组下标访问:首地址+数据类型大小*k
/// </summary>
class ArrayTest
{
int[] array;
int last;
int Maxcount;
public ArrayTest(int size)
{
array = new int[size];
Maxcount = size;
last = -1;
}
public void Append(int item)
{
if (last < Maxcount - 1)
array[++last] = item;
}
public void Insert(int i, int item)
{
if (i < 1||last==Maxcount-1||i>last+2)
return;
if (i == last + 2)
array[last + 1] = item;
else
{
int j = 0;
for (; j < i - 1; ++j)
{
array[j + 1] = array[j];
}
array[i - 1] = item;
}
++last;
}
public int Delet(int i)
{
int temp = array[0];
if (last==-1)
return -1;
if (i < 1 || i > last + 1)
return -1;
if (i == last + 1)
{
temp = array[last--];
}
else
{
temp = array[i - 1];
int j = i;
for (; j <= last; ++j)
{
array[j] = array[j + 1];
}
}
--last;
return temp;
}
public int GetIndex(int item)
{
int pos = -1;
for (int i = 0; i < Maxcount; ++i)
{
if (array[i] == item)
{
pos = i;
break;
}
}
return pos;
}
public int GetlocalValue(int i)
{
if (i < 1 || i > last + 2)
return -1;
return array[i - 1];
}
public void Print()
{
for (int i = 0; i < Maxcount; ++i)
{
Console.WriteLine(array[i]);
}
}
}
线性表操作二刷总结
最新推荐文章于 2023-06-26 10:55:43 发布