思维导图:
1.链表与顺序表(续):

2.排序:

作业:(有条件的也可以选择下载资源,资源里的代码会有详细的注释,但是代码相同。)
1.链表:
python
# 单向链表
# 链表单个结点(single node)的实现:前驱(predecessor)后继(successor)
from itertools import count
class SingleNode(object):
"""
单向结点
"""
def __init__(self, item, next=None):
self.item = item
self.next = next
# 链表两边对象(SingleLinkList)单链路列表的实现
class SingleLinkList(object):
"""
单项链表
"""
def __init__(self, node=None):
self.head = node
self.tail = None
def is_empty(self):
"""链表是否为空"""
if self.head is None:
return True
else:
return False
def length(self):
"""链表长度"""
cur = self.head
count = 0
while cur is not None:
count += 1
cur = cur.next
return count
def travel(self):
"""遍历整个链表"""
cur = self.head
print('链表中的元素:', end=' ')
while cur is not None:
print(cur.item, end=' ')
cur = cur.next
if cur is None:
print()
break
def add(self, item):
"""链表头部添加元素"""
node = SingleNode(item)
node.next = self.head
self.head = node
def append(self, item):
"""链表尾部添加元素"""
if self.head is None:
self.head = SingleNode(item)
return
else:
cur = self.head
while cur.next is not None:
cur = cur.next
cur.next = SingleNode(item)
return
def insert(self, pos, item):
"""指定位置添加元素"""
if pos == 0:
self.add(item)
return
elif pos >= self.length():
self.append(item)
return
elif 0 <= pos <= self.length():
cur = self.head
count = 0
while count < pos - 1:
count += 1
cur = cur.next
node = SingleNode(item)
node.next = cur.next
cur.next = node
def remove(self, item):
"""删除节点"""
if self.head is None:
print('链表为空')
return
cur = self.head
pre = None
if cur.item == item:
self.head = cur.next
return
else:
while cur is not None:
if cur.item == item:
pre.next = cur.next
return
else:
pre = cur
cur = cur.next
print('未找到')
def search(self, item):
"""查找节点是否存在"""
cur = self.head
while cur is not None:
if cur.item == item:
return True
cur = cur.next
return False
def test1(data):
"""测试链表实例化"""
mynode = SingleNode(data)
print('mynode--->', mynode)
linklist = SingleLinkList(mynode)
print('linklist--->', linklist)
print(mynode.item)
print(linklist.head)
print(linklist.head.item)
print(linklist.head.next)
def test2(data):
"""测试列表判空,长度,遍历"""
# 实例化结点和链表对象
mynode = SingleNode(data)
linklist = SingleLinkList(mynode)
# linklist = SingleLinkList()
# 判空
print(linklist.is_empty())
print('链表长度为:', linklist.length())
linklist.travel()
def test3(data):
"""插入节点"""
# mynode = SingleNodse(data)
# linklist = SingleLinkList(mynode)
linklist = SingleLinkList()
linklist.add(12)
linklist.add(34)
linklist.add(56)
linklist.travel()
linklist.append(98)
linklist.append(76)
linklist.append(54)
linklist.travel()
linklist.insert(2, 11)
linklist.travel()
linklist.remove(34)
linklist.travel()
print(linklist.search(34))
print(linklist.search(11))
if __name__ == '__main__':
test1(1)
test2(2)
test3(3)
2.排序
(1)冒泡排序
python
from itertools import count
def bubble_sort(mylist):
n = len(mylist)
for i in range(n-1):
for j in range(0, n-i-1):
if mylist[j] > mylist[j+1]:
mylist[j], mylist[j+1] = mylist[j+1], mylist[j]
def bubble_sort2(mylist):
n = len(mylist)
count = 0
for i in range(n-1):
for j in range(0, n-i-1):
if mylist[j] > mylist[j+1]:
mylist[j], mylist[j+1] = mylist[j+1], mylist[j]
count += 1
if count == 0:
break
if __name__ == '__main__':
mylist = [12,9,67,4,32,65,34]
bubble_sort(mylist)
print(mylist)
(2)选择排序
python
def selectionsort1(list1):
mylist = list1.copy()
for i in range(len(mylist)-1):
min_index = i
for j in range(i+1,len(mylist)):
if mylist[j] < mylist[min_index]:
min_index = j
if min_index != i:
mylist[i], mylist[min_index] = mylist[min_index], mylist[i]
return mylist
def selectionsort2(list2):
mylist = list2.copy()
for i in range(len(mylist)):
max_index = i
for j in range(i+1,len(mylist)):
if mylist[j] > mylist[max_index]:
max_index = j
if max_index != i:
mylist[i], mylist[max_index] = mylist[max_index], mylist[i]
return mylist
if __name__ == '__main__':
mylist = [12,543,8,9,4,1,0]
print(selectionsort1(mylist))
print(selectionsort2(mylist))
(3)插入排序
python
def insertion_sort(list1):
mylist = list1[:]
for i in range(1, len(mylist)-1):
for j in range(i,0,-1):
if mylist[j]<mylist[j-1]:
mylist[j],mylist[j-1]=mylist[j-1],mylist[j]
return mylist
if __name__ == '__main__':
mylist = [12,4,32,67,92,32,1,2,5]
print(insertion_sort(mylist))
(4)快速排序
python
def quicksort(mylist,start,end):
if start>end:
return
left = start
right = end
mid = mylist[start]
while left < right:
while mylist[right] >= mid and left < right:
right -= 1
mylist[left] = mylist[right]
while mylist[left] <=mid and left < right:
left += 1
mylist[right] = mylist[left]
mylist[right] = mid
quicksort(mylist,right+1,end)
quicksort(mylist,start,left-1)
if __name__ == '__main__':
mylist = [12,35,98,4,5,2,8,6,10,3,8,0,2,4,6,8,100]
quicksort(mylist,0,len(mylist)-1)
print(mylist)