1.顺序表的定义
class SqList:
def __init__(self): #构造函数
self.initcapacity=5 #初始容量设置为10
self.capacity=self.initcapacity #容量设置为初始容量
self.data=[None]*self.capacity #设置顺序表的空间
self.size=0
2. 顺序表的扩容
算法描述:
参考代码:
def resize(self, newcapacity): #改变顺序表的容量为newcapacity
assert newcapacity>=0 #检测参数正确性的断言
olddata=self.data
self.data=[None]*newcapacity
self.capacity=newcapacity
for i in range(self.size):
self.data[i]=olddata[i]
3. 整体创建顺序表(或:表尾添加单个元素创建顺序表)
算法描述:
参考代码:
def CreateList(self, a): # 由数组a中元素整体建立顺序表
for i in range(0, len(a)):
if self.size == self.capacity: # 出现上溢出时
self.resize(2 * self.size) # 扩大容量
self.data[self.size] = a[i]
self.size += 1 # 添加后元素个数增加1
4. 顺序表的长度:
算法描述:
参考代码:
def getsize(self): # 求线性表长度
return self.size
5. 顺序表的输出
算法描述:
参考代码:
def display(self): # 输出线性表
for i in range(0, self.size):
print(self.data[i], end=' ')
print()
6. 顺序表的插入
算法描述:
参考代码:
def insert(self, i, e): # 在线性表中序号i位置插入元素e
assert 0 <= i <= self.size # 检测参数i正确性的断言
if self.size == self.capacity: # 满时倍增容量
self.resize(2 * self.size)
for j in range(self.size, i, -1): # 将data[i]及后面元素后移一个位置
self.data[j] = self.data[j - 1]
self.data[i] = e # 插入元素e
self.size += 1 # 长度增1
7. 顺序表的删除
算法描述:
参考代码:
def delete(self, i): # 在线性表中删除序号i的元素
assert 0 <= i <= self.size - 1 # 检测参数i正确性的断言
for j in range(i, self.size - 1):
self.data[j] = self.data[j + 1] # 将data[i]之后的元素前移一个位置
self.size -= 1 # 长度减1
if self.capacity > self.initcapacity and self.size <= self.capacity / 4:
self.resize(self.capacity // 2) # 满足缩容条件则容量减半
8. 顺序表的逆置
算法描述:
参考代码:
def reverse(self):
i=0
j=self.size-1
while i
(建议:在顺序表的应用中,也可以写同一应用的多种实现方式,并对比分析不同的实现方式的优劣。)
9. 主函数
if __name__ == '__main__':
L=SqList()
a=[1, 2, 3, 4, 5]
L.CreateList(a)
print ("L: ",end=''), L.display()
print("Length: ", L.getsize())
print("\nL: ", end=''), L.display()
L.delete(2)
print ("delete(2) L: ",end=''), L.display()
print("\nL: ", end=''), L.display()
L.insert(2, 23)
print ("insert(2, 23) L: ",end=''), L.display()
print("\nL: ", end=''), L.display()
L.reverse()
print ("reverse L: ",end=''), L.display()
10. 算法运行结果及分析
1.整体创建运行结果:
2.删除运行结果:
3.插入运行结果:
4.顺序表的逆置
算法分析:
顺序表的创建、输出:T(n)=O(n) (一重迭代)
顺序表的长度:T(n)=O(n)
顺序表的删除、插入:T(n)=O(n) (主要花费在元素的移动上)
顺序表的逆置:T(n)=O(n)、S(n)=O(1)
说明:顺序表的相关操作很多,上面只列举了插入、删除和逆置。
class SqList:
def __init__(self): #构造函数
self.initcapacity=5 #初始容量设置为10
self.capacity=self.initcapacity #容量设置为初始容量
self.data=[None]*self.capacity #设置顺序表的空间
self.size=0
def resize(self, newcapacity): #改变顺序表的容量为newcapacity
assert newcapacity>=0 #检测参数正确性的断言
olddata=self.data
self.data=[None]*newcapacity
self.capacity=newcapacity
for i in range(self.size):
self.data[i]=olddata[i]
def CreateList(self, a): # 由数组a中元素整体建立顺序表
for i in range(0, len(a)):
if self.size == self.capacity: # 出现上溢出时
self.resize(2 * self.size) # 扩大容量
self.data[self.size] = a[i]
self.size += 1 # 添加后元素个数增加1
def getsize(self): # 求线性表长度
return self.size
def reverse(self):
i=0
j=self.size-1
while i self.initcapacity and self.size <= self.capacity / 4:
self.resize(self.capacity // 2) # 满足缩容条件则容量减半
if __name__ == '__main__':
L=SqList()
a=[1, 2, 3, 4, 5]
L.CreateList(a)
print ("L: ",end=''), L.display()
print("Length: ", L.getsize())
print("\nL: ", end=''), L.display()
L.delete(2)
print ("delete(2) L: ",end=''), L.display()
print("\nL: ", end=''), L.display()
L.insert(2, 23)
print ("insert(2, 23) L: ",end=''), L.display()
print("\nL: ", end=''), L.display()
L.reverse()
print ("reverse L: ",end=''), L.display()
代码为个人理解编写,若有错误请大佬指正!