python常用算法
来源:互联网 发布:淘宝助理如何使用 编辑:程序博客网 时间:2024/06/05 22:29
1. 插入排序
- 算法描述:将列表中每一个元素与其他元素相比较后形成新的列表
lists = [69, 65, 90, 37, 92, 6, 28, 54]print(lists)def insert_sort(lists): count = len(lists) for i in range(1, count): cur_number = lists[i] for j in range(i - 1, -1, -1): if lists[j] > cur_number: lists[j], lists[j + 1] = lists[j + 1], lists[j] else: lists[j + 1] = cur_number break return listsprint(insert_sort(lists))
2. 希尔排序
- 算法描述:在插入排序思想基础上,将列表中元素按照一定规则分组,当分组间隔为1时,排序完成
lists = [69, 65, 90, 37, 92, 6, 28, 54]print(lists)def shell_sort_1(_list): count = len(_list) gap = count // 2 while gap > 0: for i in range(gap, count): current_item = _list[i] j = i while j >= gap and current_item < _list[j - gap]: _list[j] = _list[j - gap] j -= gap _list[j] = current_item gap //= 2 return _listprint(shell_sort_1(lists))
3. 冒泡排序
- 算法描述:它重复的走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来,一直重复直到排序完成,就像从杯底向上的一个个泡泡
lists = [69, 65, 90, 37, 92, 6, 28, 54]def bubble_sort(lists): count = len(lists) for i in range(0, count): for j in range(i+1, count): if lists[i] > lists[j]: lists[i], lists[j] = lists[j], lists[i] return listsprint(bubble_sort(lists))
4. 快速排序
- 算法描述:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另外一部分的所有数据都要小,然后再按照此方法对这两部分数据进行排序。
lists = [69, 65, 90, 37, 92, 6, 28, 54]def quick_sort(_list): if len(_list) <= 1: return _list pivot = _list[len(_list) // 2] left = [x for x in _list if x < pivot] middle = [x for x in _list if x == pivot] right = [x for x in _list if x > pivot] return quick_sort(left) + middle + quick_sort(right)print(quick_sort(lists))
5. 直接选择排序
- 算法描述:
- 第1趟:在待排序lists中比较lists[0]与lists[1:n]中的值,若lists[0]>lists[min],则交换,
- 第二趟:在待排序lists中比较lists[1]与lists[2:n]中的值,若lists[1]>lists[min],则交换,以此类推
lists = [69, 65, 90, 37, 92, 6, 28, 54]def select_sort(lists): count = len(lists) for i in range(0, count): min = i for j in range(i+1, count): if lists[min] > lists[j]: min = j lists[min], lists[i] = lists[i], lists[min] return listsprint(select_sort(lists))
6. 堆排序
- 算法思路:将待排序lists构建成一个完全二叉树,二叉树的每一个父节点均大于二个子节点,处于最上端的父节点是整个序列的最大值,第一趟将最上面的父节点提出放至lists末尾,然后将整个树最小子节点放至最大父节点,重新构建二叉树,依次类推
lists = [69, 65, 90, 37, 92, 6, 28, 54]def adjust_heap(lists, i, size): lchild = 2*i+1 rchild = 2*i+2 max = i if i < size/2: if lchild < size and lists[lchild] > lists[max]: max = lchild if rchild < size and lists[rchild] > lists[max]: max = rchild if max != i: lists[max], lists[i] = lists[i], lists[max] adjust_heap(lists, max, size)def heap_sort(lists): size = len(lists) for i in range(0, size//2)[::-1]: adjust_heap(lists, i, size) for j in range(0, size)[::-1]: lists[0], lists[j] = lists[j], lists[0] adjust_heap(lists, 0, j) return lists print(heap_sort(lists))```# 7. 归并排序- 第一趟将lists中的元素以长度为1分隔并排序,第二趟以长度为3分隔并排序,最终趟以len(lists)为长度进行排序```lists = [69, 65, 90, 37, 92, 6, 28, 54, 34, 95]def merge(a, b): c = [] while len(a) != 0 and len(b) != 0: if a[0] < b[0]: c.append(a[0]) a.remove(a[0]) else: c.append(b[0]) b.remove(b[0]) if len(a) == 0: c += b else: c += a return cdef merge_sort(lists): if len(lists) == 0 or len(lists) == 1: return lists else: middle = len(lists)//2 a = merge_sort(lists[:middle]) b = merge_sort(lists[middle:]) return merge(a, b)print(merge_sort(lists))```<div class="se-preview-section-delimiter"></div># 8. 桶排序- 算法描述:将要排序的元素分配至某些“桶”中,如0~10是一个桶,10~20是一个桶,在这个桶中范围的数进行排序,然后再排序所有桶<div class="se-preview-section-delimiter"></div>
lists = [69, 65, 90, 37, 92, 6, 28, 54]
print(lists)
def insertion_sort(lists):
for i in range(1, len(lists)):
current_number = lists[i]
for j in range(i-1, -1, -1):
if lists[j] > current_number:
lists[j], lists[j+1] = lists[j+1], lists[j]
else:
lists[j+1] = current_number
break
return lists
def bucket_sort(lists, bucket_size = 5):
string = False
if len(lists) == 0 or len(lists) == 1:
return lists
elif all(isinstance(element, str) for element in lists):
string = True
lists = [ord(element) for element in lists]
min_value = lists[0]
max_value = lists[0]
for i in range(0, len(lists)): if lists[i] < min_value: min_value = lists[i] elif lists[i] > max_value: max_value = lists[i]bucket_count = math.floor((max_value - min_value) / bucket_size) + 1buckets = []for i in range(0, int(bucket_count)): buckets.append([])for i in range(0, len(lists)): buckets[math.floor(float(lists[i] - min_value) / bucket_size)].append(lists[i])sorted_array = []for i in range(0,len(buckets)): insertion_sort(buckets[i]) for j in range(0, buckets[i]): sorted_array.append(buckets[i][j])if string: return [chr(element) for element in sorted_array]else: return sorted_array```
import math
”’ 下段程序输出结果将是list1 = [10]list2 = [1, 123]list3 = [10, ‘a’]
因为首先计算了list1至list3,然后再执行打印的操作,
因此list3引用函数的返回值覆盖了list1的返回值即[10],因此list1也返回[10,’a’]
def extendlist(val, list=[]): list.append(val) return listlist1 = extendlist(10)list2 = extendlist(123, [1,])list3 = extendlist('a')print('list1 = %s'% list1)print('list2 = %s'% list2)print('list3 = %s'% list3)```'''如果要更改上述内容,则需要对代码进行如下更改'''<div class="se-preview-section-delimiter"></div>
def extendlist(val,list=None):
if list is None:
list = []
list.append(val)
return list
list1 = extendlist(10)
list2 = extendlist(123, [1,])
list3 = extendlist(‘a’)
print(‘list1 = %s’% list1)
print(‘list2 = %s’% list2)
print(‘list3 = %s’% list3)“`
”’下段程序的输出结果将是:
[[], [], [], [], []][[10], [10], [10], [10], [10]][[10, 20], [10, 20], [10, 20], [10, 20], [10, 20]][[10, 20], [10, 20], [10, 20], [10, 20], [10, 20], 30]```此时list不能简简单单的认为是5个不相关的空列表'''<div class="se-preview-section-delimiter"></div>
list = [[]]*5
print(list)
list[0].append(10)
print(list)
list[1].append(20)
print(list)
list.append(30)
print(list)“`
”’给定一个含有N个数字的列表,使用单一的列表生成式来产生一个新的列表,该列表只包含满足以下条件的值:
(1)value为偶数
(2)key为偶数
将满足条件的值建立一个新的列表”’
numb1 = [0, 1, 2, 3, 4, 5, 6, 7, 8]list1 = [2, 2, 3, 4, 5, 6, 8, 10, 12]list2 = []for number in list1[::2]: if number%2==0: list2.append(number)print(list2)```'''斐波那契数列'''<div class="se-preview-section-delimiter"></div>#简单版<div class="se-preview-section-delimiter"></div>
def fib(n):
if n==1 or n==0:
return 1
else:
return fib(n-2)+fib(n-1)
print([fib(n) for n in range(10)])“`
由于存在大量的重复计算,如fib(10)计算fib(9)和fib(8),f(9)也需要计算fib(8),因此建立一个缓存及加快计算速度
def fib(n,cache=None): if cache == None: cache = {} if n in cache: return cache[n] if n==1 or n==0: return 1 else: cache[n] = fib(n-2, cache)+fib(n-1, cache) return cache[n]print([fib(n) for n in range(10)])```'''爬楼梯:比如有7级台阶,只能1步或2步,且不能倒退,问一共有多少种排列方法'''- 简单版<div class="se-preview-section-delimiter"></div>
def climb(n,steps):
count = 0
if n<=1:
count = 1
else:
for step in steps:
count += climb(n-step, steps)
return count“`
- 效率版
“`
def decorate(func):
cache = {}
def wrap(n):
if n not in cache:
cache[n] = func(n)
return cache[n]
return wrap
@decorate
def fib(n):
if n == 1 or n == 0 :
return 1
else:
return fib(n-2)+fib(n-1)
print([fib(n) for n in range(10)])“`
- python常用排序算法
- python常用算法
- python实现常用排序算法
- 常用排序算法(Python)
- python实现常用排序算法
- 常用排序算法的Python实现
- python常用内值函数算法复杂度
- Python实现常用排序算法总结
- 常用排序算法C++ && Python实现
- 机器学习的常用算法,python实现
- 常用排序算法的Python实现
- 常用排序算法的Python实现
- Python实现: 常用排序算法 & 二叉树的遍历算法
- 常用距离算法和相关系数及其Python实现
- 常用排序算法的python实现和性能分析
- 高阶Python----常用的数据结构与算法
- 常用查找数据结构及算法(Python实现)
- 8个常用排序算法 之 python实现
- 想学习PHP的同学请切记以下几点!
- Windows上安装oracle后创建新用户
- 网络协议学习——HTTP协议POST方法的格式
- 【安全牛学习笔记】SSL、TLS拒绝服务攻击和补充概念
- ts中引用js文件(ionic3项目)
- python常用算法
- python官方文档陌生词中易混淆的单词
- windows php 添加环境变量
- [RK3288][Android6.0] 调试笔记 --- 双屏显示内核Patch
- Android 命令行构建和签署APK
- JSShell:一个基于python的交互式Shell
- 【Tensorflow keras】轻量级深度学习框架 Keras简介
- 浅谈可见性与生存期
- 关于Server.MapPath