先进先出算法|FIFO
# -*- coding: utf-8 -*-
def fifo(x):
queue=[i for i in range(x, 0, -1)]
while len(queue) > 0:
print("%d号第%d个出队列"%( queue[-1] ,x - len(queue) + 1))
queue.pop()
fifo(10)
先进后出算法|LIFO
# -*- coding: utf-8 -*-
def lifo(x):
queue=[i for i in range(x, 0, -1)]
while len(queue) > 0:
print("%d号第%d个出队列"%( queue[0] ,x - len(queue) + 1))
queue.pop(0)
lifo(10)
查找实现
# -*- coding: utf-8 -*-
fruits=["桔子","苹果","香蕉","西瓜","水蜜桃","樱桃"]
value="西瓜"
i=0
while i < len(fruits) :
if fruits[i] == value :
print( "在下标 %d 处找到了 %s"%(i,value))
break
i+=1
二分查找
二分查找后重新划定搜索范围时,“right=mid-1”、“left=mid+1”这个步骤是必不可少的,如果仅仅只是将“left”或“right”的值重设为“mid”,因为整除的存在,检索边界值时会进入无限循环,比如右边界下标为10,当左边界逼近到9的时候,因为19被2整除后仍旧是9,此时将“left=mid”,left的值并没有变动,导致程序的bug。
# -*- coding:utf-8 -*-
nums=[(x+1)**2 for x in range(20)]
print(nums)
left=0
right=len(nums)-1
find=400
while left<=right:
mid=(left+right)//2
if nums[mid]>find:
right=mid-1
print(left,right)
elif nums[mid]<find:
left=mid+1
print(left,right)
else:
print("在数组中找到了相同值%s,其下标为%s"%(find,mid))
break
if left>right:
print("数组中好像并不包含这个值哦,换个数试一试吧")
break
哈希查找
在很多教材里看到过这个词,不太明白为啥要用哈希值去代替原值,真正自己动手做了一遍之后,感觉有了一些较为粗浅的理解。一是利用字典避免了键值的重复,其二是利用相对更为简单的键值代替了原来更为复杂无序的键值,从而在后续的查找中节省了资源。比如一组电话号码的数据,利用某数求余编制2~3位数的键,查找起来自然比10位长的一串数字更为有效率一些。
# -*- coding:utf-8 -*-
HashTable={}
ages = [401, 757, 704, 885, 29, 917, 478, 16, 512, 349,
81, 459, 454, 612, 103, 520, 331, 18, 596, 268]
print(ages)
n=len(ages)
def buildTable(age,n):
for one in age:
address = one % n
while True:
if HashTable.get(address)==None:
HashTable[address]=one
break
else:
address+=1
print("构建完成的哈希表:",HashTable)
def HashFind(Value,n):
address=Value%n
while True:
if HashTable.get(address)==Value:
print("元素为%d的哈希地址为%d"%(HashTable[address],address))
break
elif HashTable.get(address)!=None:
address+=1
else:
print("哈希表里没有%d"%(Value))
break
buildTable(ages,n)
HashFind(520,n)
穷举法
# -*- coding:utf-8 -*-
for i in range(21):
for j in range(34):
k=100-i-j
if 5*i+3*j+k*1/3==100:
print("%d只公鸡,%d只母鸡,%d只小鸡满足题目要求"%(i,j,k))
冒泡排序
# -*- coding:utf-8 -*-
# python中交换值可以采用x,y=y,x的方式
# 当然python本身也实现了列表的排序方法-_-
# 重复造轮子熟悉语法也挺好对吧
lists = [24, 14, 48, 63, 10, 8, 84, 88, 70, 55]
i=0
ilen=len(lists)
while i< ilen:
j=1
while j<ilen-i:
if lists[j-1]>lists[j]:
middle = lists[j]
lists[j] = lists[j-1]
lists[j-1]=middle
j=j+1
i=i+1
print(lists)
选择排序
冒泡排序是通过数组相邻元素两两比较,大的排后面,一次比较找到整个数组最大值放在数组最后一个位置。小循环时,通过控制小循环的循环下标range j=len(array)-i-1忽略掉数组最后已经排列好的一个元素,从后往前直到最前面。选择排序是通过从前往后,从第一个数组元素和后面的元素比较,如果后面的元素小,就把该元素的值和后面的继续比较,找到最小值后,和第一个数组元素的值交换,把最小值放到数组的第一个位置。然后通过控制小循环的下标忽略掉第一个已经排好序的数组元素,从第二个元素开始继续循环找到第二小值,放到第二个元素上,以此类推,直至最后。选择排序因每次循环直接找到最小值,因此需要一个变量来记录最小值的数组元素下标。而冒泡因是两两比较,每次将大的值放到后面,所以不需要额外的变量。选择排序的值交换频率更低一些.
# -*- coding:utf-8 -*-
def selectionSort(arr):
for i in range(len(arr)):
minId=i
for j in range(i+1,len(arr)):
if arr[j]<arr[minId]:
minId=j
arr[i],arr[minId]=arr[minId],arr[i]
data = [24, 14, 48, 63, 10, 8, 84, 88, 70, 55]
selectionSort(data)
print(data)