[笔记]|[算法]MIT算法导论公开课笔记(1)——排序

[笔记]|[算法]MIT算法导论公开课笔记(1)——排序

python版本:python3.6

IDE:pycharm

更新日期:19/3/14

  • 算法分析是关于计算机程序性能和资源利用的研究

相关材料

视频地址:点此
Introduction to Algorithms ——Thomas H.Cormen、Charles E.Leiserson等著

排序算法

Input (a1, a2, …, an)

Output(a1, a2, …, an)

such that: 使得a1<=a2<=…<=an

插入排序

伪代码:

将一组数(A[1…n])按从小到大排序。

for j ← 2 to n
do key ← A[j]
i ← j-1
while i > 0 and A[i] >key
do A[i+1] ← A[i]
i ← i-1
A[i+1] ← key

2

实现过程:

1

渐进符号:θ,去掉函数的低阶项和最高阶项系数

渐进分析:算法的时间复杂度

不要仅关注时间复杂度低的算法;在数据量不大时,时间复杂度高的算法(低速算法)可能优于时间复杂度低的算法,如图中的θ(n2)与θ(n3)

3

时间复杂度:
  • θ(n^2)
具体代码:
def insertion_sort(input):
    """
    函数说明:插入排序(直插)
    时间复杂度:θ(n^2)
    Parameters:
        input   -   待排序数组
    Return:
        output  -   已排序数组
    Blog:
        https://blog.csdn.net/weixin_43991786
    Modify:
        19/3/14
    """
    for i in range(1,len(input)):
        key = input[i]
        while i > 0 and key < input[i-1]:
            input[i] = input[i-1]
            i -= 1
        input[i] = key
    return input

x = [2,3,1,4,9,5,8,6,7,0]
print("原始数据:    " + str(x))
print("插入排序:    " + str(insertion_sort(x)))

归并排序

伪代码:

sort A[1…n]

  1. if n = 1, done θ(1)

  2. recursively sort(递归排序) 2T(n/2) + θ(n) if n>1

    A[1…[n/2]] and

    A[[n/2]…n]

  3. 合并两个数组 θ(n)

递归树分析:

递归树算法来求解渐进分析

递归树:T(n) = 2T(n/2) + cn, constc > 0

4

5

这棵树的高度为:2logn

叶子结点的数目为:n

6

一般在n>30时归并排序就快于插入排序了

实现思路:
  1. 观察两张以排序的表中,最小元素是多少 ;比较两个最小元素,取出最小值
  2. 取出刚刚的最小元素,递归进行1.
  • 在这个过程中,我们只关注了两个最小元素,并挑出最小的,再把数组指针推进一位 (总能知道表头在哪)
时间复杂度:

θ(n*logn)

具体代码:
def merge_sort(xArr):
    """
    函数说明:归并排序
    时间复杂度:θ(n*logn)
    Parameters:
        xArr   -   待排序数组
    Return:
        xArr  -   已排序数组
    Blog:
        https://blog.csdn.net/weixin_43991786
    Modify:
        19/3/14
    """
    if len(xArr) > 1:
        split = len(xArr) // 2
        left_Arr = merge_sort(xArr[0:split])
        right_Arr = merge_sort(xArr[split:len(xArr)])
        i = 0
        j = 0
        k = 0
        while i<len(left_Arr) and j<len(right_Arr):
            if left_Arr[i] < right_Arr[j]:
                xArr[k] = left_Arr[i]
                k += 1
                i += 1
            else:
                xArr[k] = right_Arr[j]
                k += 1
                j += 1
        if i == len(left_Arr):
            xArr[k:] = right_Arr[j:]
        if j == len(right_Arr):
            xArr[k:] = left_Arr [i:]
    return xArr

x = [2,3,1,4,9,5,8,6,7,0]
print("原始数据:    " + str(x))
print("归并排序:    " + str(merge_sort(x)))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值