算法解读之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)
原创粉丝点击