算法导论Ch1-Ch2

第一章~第二章:

1. 几种常见的排序方法

1.1 插入排序

#!/usr/bin/env python

# -*- coding:UTF-8 -*-

'''CLRS p10'''

 

def insertion_sort(A):

    for j in range(1,len(A),1):

        key = A[j]

        i = j-1

        while i >= 0 and A[i] > key:

            A[i+1] = A[i]

            i = i-1

        A[i+1] = key

 

if  __name__ == '__main__':

    A = [9,3,5,2,3,5,7,8,9,1]

    insertion_sort(A)

 

1.2 选择排序

#!/usr/bin/env python

# -*- coding:UTF-8 -*-

'''CLRS p16'''

 

def selection_sort(A):

    i = 0

    while i < len(A)-1:

        minIndex = i

        minA = A[i]

        for j in range(i,len(A),1):

            if minA > A[j]:

                minA = A[j]

                minIndex = j

        tmp = A[i]

        A[i] = A[minIndex]

        A[minIndex] = tmp

        i += 1

              

if  __name__ == '__main__':

    A = [9,3,5,2,3,5,7,8,9,1]

    selection_sort(A)

 

1.3 归并排序

#!/usr/bin/env python

# -*- coding:UTF-8 -*-

import math

'''CLRS p16'''

def merge(A,p,q,r):

    n1 = q - p + 1

    n2 = r - q

    L = A[p:q+1]

    R = A[q+1:r+1]

    L.append(float("inf"))

    R.append(float("inf"))

    i = 0

    j = 0

    for k in range(p,r+1,1):

        if L[i] <= R[j]:

            A[k] = L[i]

            i +=1

        else:

            A[k] = R[j]

            j += 1

    

def merge_sort(A,p,r):

    if p < r:

        q = math.floor((p+r)/2)

        merge_sort(A,p,q)

        merge_sort(A,q+1,r)

        merge(A,p,q,r)

        

if  __name__ == '__main__':

    A = [9,3,5,2,3,5,7,8,9,1,11,20,0,2]

    print(A)

    merge_sort(A,0,len(A)-1)

    print(A)

 

1.4 冒泡排序

#!/usr/bin/env python

# -*- coding:UTF-8 -*-

'''CLRS p23'''

def bubble_sort(A):

    for i in range(0,len(A)-1,1):

        for j in range(len(A)-1, i,-1):

            if A[j] < A[j-1]:

                tmp = A[j]

                A[j] = A[j-1]

                A[j-1] = tmp

 

if  __name__ == '__main__':

    A = [9,3,5,2,3,5,7,8,9,1,11,20,0,2]

    bubble_sort(A)

 

2. 循环不变式

帮助理解算法的正确性。

初始化:循环的第一次迭代之前,它为真。

保持:如果循环的某次迭代之前它为真,那么下次迭代之前它仍然为真。

终止:在循环终止时,不变式为我们提供一个有用的性质,该性质有助于证明算法是正确的。

3. 分治法

分解:原问题分解为若干子问题,这些子问题是原问题的规模较小的实例。

解决:解决这些子问题,递归解决各个子问题。若子问题规模足够小,则直接求解。

合并:这些子问题的解成为原问题的解。

4. 几种增长极比较

未定式极限的洛必达法则

 

posted on 2019-05-14 19:14  SunnyPoem  阅读(214)  评论(0编辑  收藏  举报