zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    http编程中的get和post混合使用方式
    SQLServer实现作业依赖(非步骤)
    SQLServer实现两个库的字段长度自动更新
    Python+SQLite数据库实现服务端高并发写入
    sqlite数据库相关使用
    sqlite语法
    VBA关键字总结
    VS2005 .net2.0 TreeView.设置SelectedNodeStyle控制TreeView中选定节点的外观的
    SQLSERVER 2005 如何给sa用户设置空密码?
    解决超过远程连接数而无法连接服务器的问题 踢出已断开用户
  • 原文地址:https://www.cnblogs.com/Uriel-w/p/14908230.html
Copyright © 2011-2022 走看看