【数据结构】2-2-2 顺序表的插入删除查找
数据结构知识点合集
- 知识点
|
- 顺序表的插入
ListInsert(&L,i,e):插入操作。在表L中的第i个位置上插入指定元素e。
|
/*在顺序表L的第i个位置插入元素e*/
bool ListInsert(SqList &L,int i,int e)
{/*判断i的范围是否有效*/if(i<0||i>L.length)return false;/*判断是否有空间能够插入*/if(L.length>=MaxSize)return false;/*将第i个元素及其后面的元素后移*/for(int j=L.length;j>=i;j--)L.data[j]=L.data[j-1];/*在顺序表的第i个位置插入元素e*/L.data[i-1]=e;/*顺序表的长度加一*/L.length++;/*插入成功,返回true*/return true;
}
顺序表插入操作时间复杂度分析:
最好情况:新元素插入到表尾,不需要移动元素i = n+1,循环0次;最好时间复杂度 = O(1)
最坏情况:新元素插入到表头,需要将原有的 n 个元素全都向后移动i = 1,循环 n 次;最坏时间复杂度 = O(n);
平均情况:假设新元素插入到任何一个位置的概率相同,即 i = 1,2,3, … , length+1 的概率都是 p = 1/(n+1)
i = 1,循环 n 次;i=2 时,循环 n-1 次;i=3,循环 n-2 次 …… i =n+1时,循环0次
平均循环次数 = np + (n-1)p + (n-2)p + …… + 1⋅p =[n(n+1)/2] * [1/(n+1)] = n/2 平均时间复杂度 = O(n)
- 顺序表的删除
ListDelete(&L,i,&e):删除操作。删除表L中第i个位置的元素,并用e返回删除元素的值。
|
/*将顺序表第i个位置的元素删除,并将删除元素值记录*/
bool ListDelete(SeqList &L,int i,int &e)
{/*判断i的范围是否有效*/if(i<0||i>L.length)return false;/*将被删除的元素赋值给e*/e=L.data[i-1];/*将第i个位置后的元素前移*/for(int j=i;j<L.length;j++)L.data[j-1]=L.data[j];/*顺序表的长度减一*/L.length--;/*删除成功,返回true*/return true;
}
顺序表删除操作时间复杂度分析:
最好情况:删除表尾元素,不需要移动元素i = n,循环0次;最好时间复杂度 = O(1)
最坏情况:删除表头元素,需要将原有的 n 个元素全都向前移动;i = 1,循环 n 次;最坏时间复杂度 = O(n);
平均情况:假设删除任何一个元素的概率相同,即 i = 1,2,3, … , length+1 的概率都是 p = 1/n
i = 1,循环 n-1 次;i=2 时,循环 n-2次;i=3,循环 n-3 次 …… i =n时,循环0次
平均循环次数 = (n-1)p + (n-2)p + …… + 1⋅p =[n(n-1)/2] * [1/n] = (n-1)/2 平均时间复杂度 = O(n)
- 顺序表的按位置查找
|
|
/*在顺序表L中查找第i个元素并返回其值*/
int GetElemByPosition(SeqList L,int i)
{return L.data[i-1];
}
由于顺序表的各个数据元素在内存中连续存放,因此可以根据起始地址和数据元素大小立即找到第 i 个元素(随机存取)
时间复杂度:O(1)
- 顺序表的按值查找
|
/*在顺序表L中查找值为e的元素并返回其位置*/
int GetElemByValue(SeqList L,int e)
{for(int i=0;i<L.length;i++){if(L.data[i]==e)return i+1;}/*查找失败,返回0*/return 0;
}
最好情况:目标元素在表头;循环1次;最好时间复杂度 = O(1)
最坏情况:目标元素在表尾;循环 n 次;最坏时间复杂度 = O(n);
平均情况:假设目标元素出现在任何一个位置的概率相同,都是 1/n;目标元素在第1位,循环1次;在第2位,循环2
次;…… ;在第 n 位,循环 n 次;平均循环 次数=(1+2+3+…+n)*(1/n)=(n+1)/2;平均时间复杂度 = O(n)