算法
1 #递归 2 def fun(x): 3 if x>0: 4 fun(x-1) 5 print(x) 6 # fun(2) 7 8 # print(4/2) 9 # lis=[ 10 # {'id':1001, 'name':"张三", 'age':20}, 11 # {'id':1002, 'name':"李四",'age':25}, 12 # {'id':1003, 'name':"李四2",'age':25}, 13 # {'id':1004, 'name':"王五", 'age':23}, 14 # {'id':1005, 'name':"王五2", 'age':23}, 15 # {'id':1006, 'name':"王五3", 'age':23}, 16 # {'id':1007, 'name':"王五4", 'age':23}, 17 # {'id':1008, 'name':"王五5", 'age':23}, 18 # {'id':1009, 'name':"王五5", 'age':23}, 19 # {'id':10010, 'name':"王五7", 'age':23}, 20 # {'id':10011, 'name':"王五8", 'age':23}, 21 # {'id':10012, 'name':"赵六", 'age':33} 22 # ] 23 24 25 #二分叉 26 # def select_stu(list,id): 27 # low=0 28 # high=len(list)-1 29 # while low<=high: 30 # mid=int((low+high)/2) #用low+high)//2就不需要转换了,//去掉小数 31 # if lis[mid]['id']==id: 32 # return lis[mid]['id'],lis[mid]['name'],lis[mid]['age'] 33 # elif lis[mid]['id']>id: 34 # high=mid-1 35 # elif lis[mid]['id']<id: 36 # low=mid+1 37 # else: 38 # return '不存在' 39 # print(select_stu(lis,1001)) 40 41 # lis=[6,11,3,9,8,9,2,4,5,7,8,7,4] 42 43 #冒泡排序,自己写的冗余了 44 # lis=[11,3,9,8,9,2,4,5,7,8,7,4] 45 # for i in range(len(lis)): 46 # for j in range(i,len(lis)): 47 # if lis[i]>lis[j]: 48 # lis[i],lis[j]=lis[j],lis[i] 49 50 #冒泡排序,正确的冒泡排序 51 # for i in range(len(lis)-1): 52 # for j in range(len(lis)-i-1): 53 # if lis[j]<lis[j+1]: 54 # lis[j],lis[j+1]=lis[j+1],lis[j] 55 56 # lis=[11, 9, 9, 8, 8, 7, 7, 5, 4, 4, 3, 2] 57 #冒泡排序,优化,如果没有交换两个参数,那么说明排序就是正确的 58 # for i in range(len(lis)-1): 59 # for j in range(len(lis)-i-1): 60 # flg=True 61 # if lis[j]<lis[j+1]: 62 # lis[j],lis[j+1]=lis[j+1],lis[j] 63 # flg=False 64 # if flg: 65 # print(lis) 66 # exit('提前结束') 67 68 #选择排序,选出最小的数,放左边,然后选出剩下数组的最小数,放左边,依次选下去 69 # lis=[11,3,9,8,9,2,4,5,7,8,7,4] 70 # for i in range(len(lis)-1): 71 # min_var=i 72 # for j in range(i+1,len(lis)): 73 # if lis[j]<lis[min_var]: 74 # min_var = j 75 # if min_var!=i: 76 # lis[min_var],lis[i]=lis[i],lis[min_var] 77 # print(lis) 78 #自己捣鼓的 79 # for i in range(len(lis)-1): 80 # min_data = lis[i] 81 # for j in range(i+1,len(lis)): 82 # if lis[j]<min_data: 83 # lis[j],min_data=min_data,lis[j] 84 # lis[i]=min_data 85 # for i in range(len(lis)-1): 86 # min_data = i 87 # for j in range(i+1,len(lis)): 88 # if lis[j]<lis[min_data]: 89 # min_data=j 90 # lis[i],lis[min_data]=lis[min_data],lis[i] 91 # print(lis) 92 93 #插入排序,有序区和无序区,第一个元素为有序区,其他元素为无序区,从无序区调一个元素到有序区,进行插入排序,直到无序区没有数据 94 #冒泡排序+插入排序,不是正宗的插入排序 95 # lis=[11,3,9,8,9,2,4,5,7,8,7,4] 96 # for i in range(len(lis)-1): 97 # for j in range(i+1,len(lis)): 98 # for k in range(j): 99 # if lis[k]>lis[j]: 100 # lis[k], lis[j] = lis[j], lis[k] 101 # print(lis) 102 103 #自己捣鼓的插入排序 104 # def insert_sort(lis): 105 # for i in range(len(lis)-1): 106 # tmp=lis[i+1] 107 # while i>=0 and lis[i] > tmp: 108 # lis[i+1]=lis[i] 109 # i-=1 110 # lis[i+1]=tmp 111 # return lis 112 # print(insert_sort(lis)) 113 114 #使用list的pop属性的插入排序 115 # def insert_sort(lis): 116 # for i in range(len(lis)-1): 117 # tmp=lis.pop(i+1) 118 # while i>=0 and lis[i] > tmp: 119 # i-=1 120 # lis.insert(i+1,tmp) 121 # return lis 122 # print(insert_sort(lis)) 123 124 # lis=[6,11,3,9,8,9,2,4,5,7,8,7,4] 125 #使用二分叉的插入排序 126 # def insert_sort(lis): 127 # for i in range(len(lis)-1): 128 # tmp=lis.pop(i+1) 129 # low=0 130 # high=i 131 # while low<=high: 132 # mid=(low+high)//2 133 # if lis[mid]>=tmp: 134 # high=mid-1 135 # elif lis[mid]<=tmp: 136 # low=mid+1 137 # if lis[mid] >= tmp: 138 # lis.insert(mid, tmp) 139 # else: 140 # lis.insert(mid+1, tmp) 141 # return lis 142 # print(insert_sort(lis)) 143 144 # 正宗的插入排序:依次取出无序区的元素和有序区的元素对比(从末尾比对到最前面),如过元素大于有序区末尾元素,那么在有序区后面添加取出的元素; 145 # 否则添加元素为之前的末尾元素,取出的元素继续与前面的元素比,一直执行下去。 146 # lis=[11,3,9,8,9,2,4,5,7,8,7,4] 147 # for i in range(1,len(lis)): 148 # tmp=lis[i] 149 # j=i-1 150 # while j >=0 and lis[j]>tmp: 151 # lis[j+1]=lis[j] 152 # j-=1 153 # lis[j+1]=tmp 154 # print(lis) 155 156 157 #快速排序 158 #1.归位,先把第一个元素拿出来,用一个临时变量tmp存储,接下来需要把大的放右边,小的放左边 159 #2.lit[-1]和tmp比较,如果lit[-1]>tmp,继续比较lit[-2]和tmp,如果lit[-2]<=tmp,那么需要把lit[-2]放到之前tmp的位置0,即lis[0]=lit[-2] 160 #3.上面把lis[-2]这个提前面来了,那么,lis[-2]这个位置空粗来了,需要找一个比tmp大的数填进去 161 #4.lis[0]后面就开始比较lis[1]和ltmp了,如果lit[1]<tmp,那么lit[1]不用动,接着比较lis[2]与tmp,如果lit[2]>tmp,那么把lit[2]放到之前lis[-2]这个位置 162 #5.现在lis[2]这个位置空出来了,那么需要找一个比tmp小的数塞进去,就从lis[-3]开始找,重复234的步骤,一直找下去,直到都比对完成,最后把拿出来的tmp再塞回去 163 #6.塞tmp,当最后只剩下一个位置的时候,那这个位置就是tmp的,这个位置下标是多少呢?6 164 #比如lis=[6,11,3,9,8],那么比对完成的结果是:lis=[3,11,11,9,8] 塞进去的位置就是1 165 #7.上面的过程就是归位,这个步骤完成后,就需要左边的再来一次上述的步骤,右边再来一次上述的步骤,也就是递归,一直递归下去,直到下标重合,也就是左下标等于右下标 166 # lis=[6,11,3,9,8,9,2,4,5,7,8,7,4] 167 # def quick_sort(lis,left,right): 168 # if left<right: 169 # mid=partition(lis,left,right) 170 # quick_sort(lis, left, mid-1) 171 # quick_sort(lis, mid+1, right) 172 # def partition(lis,left,right): 173 # tmp=lis[left] 174 # while left<right: 175 # while left<right and lis[right]>=tmp: 176 # right-=1 177 # lis[left]=lis[right] 178 # while left<right and lis[left]<=tmp: 179 # left+=1 180 # lis[right]=lis[left] 181 # lis[left]=tmp 182 # return left 183 # quick_sort(lis,0,len(lis)-1) 184 # print(lis) 185 186 #堆排序 187 # lis=[6,11,3,9,8,9,2,4,5,7,8,7,4] 188 # def shift(lis,low,high): 189 # i=low 190 # j=2*i+1 191 # tmp=lis[low] 192 # while j<=high: 193 # if j<high and lis[j]<lis[j+1]: 194 # j+=1 195 # if tmp<lis[j]: 196 # lis[i] = lis[j] 197 # i=j 198 # j=2*i+1 199 # else: 200 # break 201 # lis[i]=tmp 202 # def heap_sort(lis): 203 # n=len(lis) 204 # for i in range(n//2-1,-1,-1): 205 # shift(lis,i,n-1) 206 # for i in range(n-1,-1,-1): 207 # lis[i],lis[0]=lis[0],lis[i] 208 # shift(lis,0,i-1) 209 # heap_sort(lis) 210 # print(lis) 211 212 213 #归并排序 214 # # lis=[6,11,3,9,8,9,2,4,5,7,8,7,4] 215 # lis=[7, 7, 8, 8, 9, 9, 11,2, 3, 4, 4, 5, 6] 216 #一次归并 217 # def merge(lis,left,right): 218 # lis2 = [] 219 # i=right 220 # j=len(lis) 221 # while left<i and right<j: 222 # if left<i and right<j: 223 # if lis[left] <= lis[right]: 224 # lis2.append(lis[left]) 225 # left += 1 226 # elif lis[left] >= lis[right]: 227 # lis2.append(lis[right]) 228 # right += 1 229 # if left==i: 230 # for k in range(right,j): 231 # lis2.append(lis[k]) 232 # if right == j: 233 # for k in range(left,i): 234 # lis2.append(lis[k]) 235 # print(lis2) 236 237 # lis=[6,11,3,9,8,9,2,4,5,7,8,7,4] 238 # lis=[7, 7, 8, 8, 9, 9, 11,2, 3, 4, 4, 5, 6] 239 # #一次归并优化 240 # def merge(lis,low,mid,high): 241 # lis2=[] 242 # i=low 243 # j=mid+1 244 # while i<=mid and j<=high: 245 # if lis[i]<=lis[j]: 246 # lis2.append(lis[i]) 247 # i+=1 248 # else: 249 # lis2.append(lis[j]) 250 # j+=1 251 # while i<=mid: 252 # lis2.append(lis[i]) 253 # i += 1 254 # while j<=high: 255 # lis2.append(lis[i]) 256 # j += 1 257 # print(lis2) 258 # # merge(lis,0,6,len(lis)-1) 259 # def merge_sort(lis,low,high): 260 # if low<high: 261 # mid=(low+high)//2 262 # merge_sort(lis,low,mid) 263 # merge_sort(lis,mid+1,high) 264 # merge(lis,low,mid,high) 265 266 #计数排序,1000万人按年龄排序 267 # import random 268 # lis=[] 269 # for i in range(10000): 270 # lis.append(random.randint(0,100)) 271 # def count(lis,max_num): 272 # count_lis=[0 for i in range(max_num+1)] 273 # for i in range(max_num+1): 274 # count_lis[i]+=lis.count(i) 275 # j=0 276 # for num,m in enumerate(count_lis) : 277 # for i in range(m): 278 # lis[j]=num 279 # j+=1 280 # print(len(lis)) 281 # print(lis) 282 # count(lis,100) 283 # print(len(lis)) 284 # print(lis) 285 286 import random 287 lis=[] 288 for i in range(100): 289 lis.append(random.randint(0,100)) 290 #N个数求前K大的数,自己捣鼓 291 # def topk(lis,k): 292 # tmp_lis=lis[0:k+1] 293 # for i in range(1,len(tmp_lis)): 294 # j=i-1 295 # while j>=0 and tmp_lis[j+1]>tmp_lis[j]: 296 # tmp_lis[j+1],tmp_lis[j]=tmp_lis[j],tmp_lis[j+1] 297 # j-=1 298 # for i in range(k+1,len(lis)): 299 # tmp_lis[k]=lis[i] 300 # j=k-1 301 # while j>=0 and tmp_lis[j+1]>tmp_lis[j]: 302 # tmp_lis[j+1],tmp_lis[j]=tmp_lis[j],tmp_lis[j+1] 303 # j-=1 304 # print(tmp_lis) 305 # topk(lis,10) 306 307 #优化 308 # def topk(lis,k): 309 # heap=lis[0:k] 310 # for i in range(k//2-1,-1,-1): 311 # sift 312 313 # lis=[1,2,5,4,6] 314 # sm=3 315 # def get_num(lis,sm): 316 # for i in range(len(lis)): 317 # for j in (i+1,len(lis)): 318 # if lis[i]+lis[j]==sm: 319 # return(i,j) 320 # print(get_num(lis,sm)) 321 322 # team1=['a','b','c'] 323 # team2=['x','y','z'] 324 # #a不和x,b不和y、z 325 # for i in team1: 326 # for j in team2: 327 # if i=='a' and j=='x': 328 # continue 329 # elif i=='b' and (j=='y' or j=='z'): 330 # continue 331 # print('%s对战%s'%(i,j))
夕闻道不如朝闻道