python进阶_Day8
思维导图:
1.链表与顺序表(续):
2.排序:
作业:(有条件的也可以选择下载资源,资源里的代码会有详细的注释,但是代码相同。)
1.链表:
# 单向链表
# 链表单个结点(single node)的实现:前驱(predecessor)后继(successor)
from itertools import countclass SingleNode(object):"""单向结点"""def __init__(self, item, next=None):self.item = itemself.next = next# 链表两边对象(SingleLinkList)单链路列表的实现
class SingleLinkList(object):"""单项链表"""def __init__(self, node=None):self.head = nodeself.tail = Nonedef is_empty(self):"""链表是否为空"""if self.head is None:return Trueelse:return Falsedef length(self):"""链表长度"""cur = self.headcount = 0while cur is not None:count += 1cur = cur.nextreturn countdef travel(self):"""遍历整个链表"""cur = self.headprint('链表中的元素:', end=' ')while cur is not None:print(cur.item, end=' ')cur = cur.nextif cur is None:print()breakdef add(self, item):"""链表头部添加元素"""node = SingleNode(item)node.next = self.headself.head = nodedef append(self, item):"""链表尾部添加元素"""if self.head is None:self.head = SingleNode(item)returnelse:cur = self.headwhile cur.next is not None:cur = cur.nextcur.next = SingleNode(item)returndef insert(self, pos, item):"""指定位置添加元素"""if pos == 0:self.add(item)returnelif pos >= self.length():self.append(item)returnelif 0 <= pos <= self.length():cur = self.headcount = 0while count < pos - 1:count += 1cur = cur.nextnode = SingleNode(item)node.next = cur.nextcur.next = nodedef remove(self, item):"""删除节点"""if self.head is None:print('链表为空')returncur = self.headpre = Noneif cur.item == item:self.head = cur.nextreturnelse:while cur is not None:if cur.item == item:pre.next = cur.nextreturnelse:pre = curcur = cur.nextprint('未找到')def search(self, item):"""查找节点是否存在"""cur = self.headwhile cur is not None:if cur.item == item:return Truecur = cur.nextreturn Falsedef 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)冒泡排序
from itertools import countdef 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 = 0for 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 += 1if count == 0:breakif __name__ == '__main__':mylist = [12,9,67,4,32,65,34]bubble_sort(mylist)print(mylist)
(2)选择排序
def selectionsort1(list1):mylist = list1.copy()for i in range(len(mylist)-1):min_index = ifor j in range(i+1,len(mylist)):if mylist[j] < mylist[min_index]:min_index = jif min_index != i:mylist[i], mylist[min_index] = mylist[min_index], mylist[i]return mylistdef selectionsort2(list2):mylist = list2.copy()for i in range(len(mylist)):max_index = ifor j in range(i+1,len(mylist)):if mylist[j] > mylist[max_index]:max_index = jif max_index != i:mylist[i], mylist[max_index] = mylist[max_index], mylist[i]return mylistif __name__ == '__main__':mylist = [12,543,8,9,4,1,0]print(selectionsort1(mylist))print(selectionsort2(mylist))
(3)插入排序
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)快速排序
def quicksort(mylist,start,end):if start>end:returnleft = startright = endmid = mylist[start]while left < right:while mylist[right] >= mid and left < right:right -= 1mylist[left] = mylist[right]while mylist[left] <=mid and left < right:left += 1mylist[right] = mylist[left]mylist[right] = midquicksort(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)