算法解读之Python篇
来源:互联网 发布:微信站街用什么软件 编辑:程序博客网 时间:2024/06/08 15:28
堆排序
堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。
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 build_heap(lists, size): for i in range(0, (size/2))[::-1]: adjust_heap(lists, i, size)def heap_sort(lists): size = len(lists) build_heap(lists, size) for i in range(0, size)[::-1]: lists[0], lists[i] = lists[i], lists[0] adjust_heap(lists, 0, i)
归并排序
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
归并过程为:比较a[i]和b[j]的大小,若a[i]≤b[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1;否则将第二个有序表中的元素b[j]复制到r[k]中,并令j和k分别加上1,如此循环下去,直到其中一个有序表取完,然后再将另一个有序表中剩余的元素复制到r中从下标k到下标t的单元。归并排序的算法我们通常用递归实现,先把待排序区间[s,t]以中点二分,接着把左边子区间排序,再把右边子区间排序,最后把左区间和右区间用一次归并操作合并成有序的区间[s,t]。
def merge(left, right): i, j = 0, 0 result = [] while i < len(left) and j < len(right): if left[i] <= right[j]: result.append(left[i]) i += 1 else: result.append(right[j]) j += 1 result += left[i:] result += right[j:] return resultdef merge_sort(lists): if len(lists) <= 1: return lists num = len(lists) / 2 left = merge_sort(lists[:num]) right = merge_sort(lists[num:]) return merge(left, right)
基数排序
基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。
import mathdef radix_sort(lists, radix=10): k = int(math.ceil(math.log(max(lists), radix))) bucket = [[] for i in range(radix)] for i in range(1, k+1): for j in lists: bucket[j/(radix**(i-1)) % (radix**i)].append(j) del lists[:] for z in bucket: lists += z del z[:] return lists
笛卡尔乘积
笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尓积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员。
a=[1,2,3,4]b=[5,6,7,8]c=[(x,y,x*y) for x in a for y in b]print(c)
斐波拉契数列
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用
a,b=0,1for i in range(0,12): c=a+b a=b b=c print(c) a,b=b,a+b
a=[1,1]for i in range(2,12): a.append(a[i-1]+a[i-2])a.reverse()print(a)
def f(n=12): count=1 a,b=0,1 while count<=n: yield b a,b=b,a+b count+=1for i in f(12): print (i)
- 算法解读之Python篇
- 递归算法之排列问题解读
- 分类算法 之 朴素贝叶斯--理论解读
- Python之闰年算法
- Python算法之排序
- Python C API 解读随笔 ----简介篇
- SEO深度解读之HITS链接分析算法
- 人脸对齐之GBDT(ERT)算法解读
- python 算法之栈
- python算法之二分查找
- [算法工程师之]Python常用工具
- 排序算法之python实现
- 遗传算法之Python实现
- 源码解读之Intent解读
- Python字符串查找算法之BMHBNFS算法
- 解读Python内存管理机制
- 解读Python内存管理机制
- 解读Python内存管理机制
- Sparsity and Some Basics of L1 Regularization
- POJ 3660Cow Contest
- python 学习笔记一
- RecyclerView解决CheckBox复用问题
- JavaScript 原生ajax的简单示例
- 算法解读之Python篇
- 通达OA2017恢复数据库Access denied for user 'root'@'localhost' (using password: YES)报错的解决办法
- 前端面试题(一)
- bzoj 2055 80人环游世界
- win10中启用Linux Bash环境
- AOJ-problem-801
- 监听软键盘的弹起和收起
- 在git上取得源码
- 乱码问题