python 基础算法

  1 #算法:解决问题的方法和步骤
  2 
  3 #排序算法
  4 #选择排序
  5 def select(items, comp = lambda x,y : x <y):
  6     #通过隐藏函数lambda判断两个数的大小
  7     items = items[:]
  8     for i in range(len(items) - 1):
  9         min = i
 10         for j in range(i+1, len(items)):
 11             if comp(items[j], items[min]):
 12                 #获得j以后的最小值
 13                 min = j
 14         items[i], items[min] = items[min], items[i]
 15         #将判断得到的最小值放在前面
 16     return items
 17 
 18 #冒泡排序
 19 def maopao(items, tem = lambda x, y : x > y):
 20     items = items[:]
 21     for i in range(len(items) - 1):
 22         exambine = False
 23         for j in range(len(items) - 1 - i):
 24             #把最大的放在最后
 25             if tem(items[j], items[j + 1]):
 26                 items[j], items[j + 1] = items[j+1], items[j]
 27                 exambine = True
 28         if not exambine:
 29             break
 30     return items
 31 
 32 #搅拌排序
 33 def jban_select(items, stm = lambda x, y : x > y):
 34     items = items[:]
 35     for i in range(len(items)-1):
 36         exim = False
 37         for j in range(len(items) - 1 -i): 
 38             #把最大的放到最后
 39             if stm(items[j], items[j+1]):
 40                 items[j], items[j+1] = items[j+1], items[j]
 41                 exim = True
 42         if exim:
 43             exim = False
 44             for x in range(len(items)-2-i, 0, -1):
 45                 #把最小的放在最前面
 46                 if stm(items[x-1], items[x]):
 47                     items[x-1], items[x] = items[x],items[x-1]
 48                     exim = True
 49         if not exim:
 50             break
 51     return items
 52 
 53 #归并排序
 54 def collect(items1, items2, comp = lambda x,y : x <y):
 55     items = []
 56     #print('items1%s' %items1)
 57     #print('items2%s' %items2)
 58     index1, index2 = 0, 0
 59     while index1 < len(items1) and index2 < len(items2):
 60         if comp(items1[index1], items2[index2]):
 61             items.append(items1[index1])
 62             index1 += 1
 63         else:
 64             items.append(items2[index2])
 65             index2 += 1
 66     items += items1[index1:]
 67     items += items2[index2:]
 68     #print('items%s'%items)
 69     return items
 70 def after(items):
 71     return sort(list(items))
 72 
 73 def sort(items):
 74     if len(items) < 2:
 75         return items
 76     mid = len(items) // 2
 77     left = sort(items[:mid])
 78     right = sort(items[mid:])
 79     #print('left:%s' %left)
 80     #print('right%s' %right)
 81     return collect(left, right)
 82 print(after([23,45,2,4,5232,1]))
 83 
 84 #查找算法
 85 #顺序查找
 86 def function(items, key):
 87     for number, value in enumerate(items):
 88         if value == key:
 89             return number
 90     return -1 #若不存在key,安全退出
 91 
 92 #折半查找
 93 def half_holt(items, key):
 94     #items为从小到大排列
 95     start, end = 0, len(items)-1
 96     while start < end:
 97         mid = (start + end) // 2
 98         if key < items[mid]:
 99             end = mid -1
100         elif key > items[mid]:
101             start = mid +1
102         else:
103             return mid
104     return -1
105 
106 #穷举法(百元百鸡)
107 #公鸡5元一只,母鸡3元一只,小鸡1元3只
108 for i in range(20):
109     for j in range(33):
110         k = 100 - i - j
111         if i*5 + j*3 + k/3 == 100 and k % 3 == 0:
112             print('公鸡%d只,母鸡%d只,小鸡%d只' %(i, j, k))
113 
114 #五人分鱼
115 fish = 6
116 while True:
117     total = fish
118     enough = True
119     for _ in range(5):
120         #保证5次分鱼都是一样的
121         if (total-1) % 5 == 0:
122             total = (total - 1) // 5 *4
123         else:
124             enough = False
125             break
126     if enough:
127         print(fish)
128         break
129     fish += 5
130 
131 #贪婪法(不追求最优解,快速找到满意解)
132 class power_weight():
133 
134     def __init__(self, name, price, weight):
135         self.name = name
136         self.weight = weight
137         self.price = price
138     @property
139     def thing_count(self):
140         return self.price / self.weight
141 
142 def ip_thing():
143     name, weight, price = input('拥有的物品及属性:').split()
144     #split() 通过指定分隔符对字符串进行切片
145     return name, int(weight), int(price)
146 
147 def main():
148     max_weight, mun_thing = map(int, input('总重和总的物品件数:').split())
149     #map(function, iterable, ...),对序列根据方法排序
150     thing_rate = []
151     for _ in range(mun_thing):
152         thing_rate.append(power_weight(*ip_thing()))
153     thing_rate.sort(key=lambda x : x.thing_count ,reverse = True)
154     #key=lambda x : x.thing_count 不太懂
155     total_weight = 0
156     total_price = 0
157     print('ok')
158     for thing in thing_rate:
159         if total_weight + thing.weight <= max_weight:
160             print(f'小偷带走了{thing.name}')
161             total_weight += thing.weight
162             total_price += thing.price
163     print(f'总价值{total_price}美元')
164 
165 if __name__ == '__main__':
166         main()
167 
168 #快速排列(选择枢轴对元素进行划分,左边都比枢轴小右边都比枢轴大)
169 def main(items, comp = lambda x, y : x <= y):
170     items = items[:]
171     func1(items, 0, len(items) - 1, comp)
172     return items
173 
174 def func1(items, start ,end, comp):
175     if start < end:
176         pol = func2(items, start, end, comp)
177         func1(items, start, pol-1, comp)
178         func1(items, pol +1, end,comp)
179 
180 def func2(items, start, end, comp):
181     boss = items[end]
182     i = start -1
183     for j in range(start, end):
184         if comp(items[j], boss):
185             i +=1
186             items[i], items[j] = items[j], items[i]
187     items[i+1], items[end] = items[end], items[i+1]
188     return i+1
189 
190 #动态规则
191 items = list(map(int, input('输入数列').split()))
192 overall = part = items[0]
193 for i in range(1, len(items)):
194     part = max(items[i], part+items[i])
195     overall = max(part, overall)
196 print(overall)

 

posted @ 2021-06-20 20:58  Uriel-w  阅读(98)  评论(0编辑  收藏  举报