MIT6.006Lec03:插入排序,归并排序,递归树

MIT6.006是算法导论课,Lec03主要讲插入排序,归并排序,以及分析方法(递归树)等。

插入排序,可以分为线性插入排序、二分插入排序,区别在于当把数组中某元素插入到前面的有序列表中时,前者遍历,后者二分,后者更加稳定。

归并排序,是用分治思想处理,先分别排序,再合并。

递归树,我的理解是算法消耗时间T(n)用树状的结构,表示每次递归消耗的时间,这些时间累加就是T(n),而递归树的每一行和相邻行之间的关系也是比较容易观察的,这就容易写出时间复杂度的表达式了。另外有主定理可以使用。

参考了《算法导论》和网络上的资源,以下是我修改后的代码:

#coding:utf8
#插入排序 版本1(线性插入排序)

def insertion_sort1(a):
    for j in range(1, len(a)):
        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__':
    array = [2,2, 4, 32, 64, 34, 78, 23, 2345, 12, 1, 3, 2]
    insertion_sort1(array)
    for a in array:
        print a

  

# coding:utf8# 插入排序 版本2(二分插入排序)def binInsertSort(a):
    n = len(a)
    for j in range(1, n):
        key = a[j]
        i = j - 1

        if key > a[i]:
            continue
        l, r = 0, i
        while l <= r:
            #print l, r
            mid = (l + r) / 2
            if key < a[mid]:
                r = mid - 1
            else:
                l = mid + 1
        k = j
        while k > l:
            a[k] = a[k - 1]
            k = k - 1

        a[l] = key

if __name__ == '__main__':
    array = [2, 2, 4, 32, 64, 34, 78, 23, 2345, 12, 1, 3]
    insertsort(array)
    for a in array:
        print a

  

#coding:utf8
#归并排序
#MIT6.006 Lec03

def merge_sort(a, l, r):
    '''归并排序主程序'''
    if l < r:
        m = (l + r) / 2
        merge_sort(a, l, m)
        merge_sort(a, m + 1, r)
        merge(a, l, m, r)

def merge(a, l, m, r):
    '''归并两个有序表'''
    left = a[l:m+1]
    right = a[m+1:r+1]
    len1 = len(left)
    len2 = len(right)
    i, j, k = 0, 0, l
    while i<len1 and j < len2:
        if left[i] < right[j]:
            a[k] = left[i]
            i = i + 1
        else:
            a[k] = right[j]
            j = j + 1
        k += 1
    while i<len1:
        a[k] = left[i]
        k += 1
        i += 1
    while j<len2:
        a[k] = right[j]
        k += 1
        j += 1

if __name__ == '__main__':
    array = [2, 2, 4, 32, 64, 34, 78, 23, 2345, 12, 1, 3, 2]
    merge_sort(array, 0, len(array)-1)
    for a in array:
        print a

  

时间: 2024-11-01 22:43:37

MIT6.006Lec03:插入排序,归并排序,递归树的相关文章

mysql-使用MYSQL实现oracle start with connect by递归树查询

问题描述 使用MYSQL实现oracle start with connect by递归树查询 代码如下,如何修改,感谢 DELETE FROM SFL_YWZYFL WHERE YWZYFL_ID IN (SELECT YWZYFL_ID FROM SFL_YWZYFL START WITH YWZYFL_ID IN(:ids) CONNECT BY PRIOR YWZYFL_ID=SFL_YWZYFL_ID) 不要沉啊! 解决方案 没卵用没卵用没卵用没卵用没卵用没卵用没卵用没卵用没卵用 解决

【JAVA秒会技术之搞定数据库递归树】Mysql快速实现递归树状查询

Mysql快速实现递归树状查询 [前言]今天一个好朋友问我的这个问题,以前也没有用到过,恰好有时间,就帮他研究了一下,纯属"现学现卖",正好在过程中,自己也能学习一下!个人感觉,其实一点也不难,不过是"闻道有先后",我们是"后"罢了.按照我的习惯,学完东西,总要总结一下嘛,也当做一个备忘录了.   具体需求就不描述了,简而言之,归结为两个: 1.如何通过子节点(cid)加载出所有的父节点(pid)? 2.如何通过父节点(pid)加载出所有的子节点

在Silverlight中使用HierarchicalDataTemplate为TreeView实现递归树状结构

转自http://www.cnblogs.com/chenxizhang/archive/2011/06/22/2087692.html   这是项目中一个页面上的一个功能.我们需要在界面上通过一个TreeView控件显示一个递归的树状结构,也就是说会很多层嵌套的节点,而且层数是不确定的. 这个功能,可以通过HierarchicalDataTemplate来很方便地实现1. 业务实体 作为举例,我定义了一个大家都很熟悉的Folder类型,即文件夹.我们都知道,文件夹又可以包含子文件夹,而且可以多

asp.net 2.0 中递归树的实现

asp.net|递归 HTML页面:   -------------------------------------------------------------------------------- <%...@ Page Language="VB" AutoEventWireup="false" CodeFile="TreeView.aspx.vb" Inherits="TreeView" %> <!D

不用递归实现论坛树型结构的算法

递归|树型结构|算法 <jsp:useBean id="mybbs" scope="session" class="netzero.mydb" /> <%@ page contentType="text/html;charset=gb2312" %> <%@ page import="java.io.*" %> <%@ page import="java.

树型论坛递归加速

递归 树型论坛递归加速一般的论坛都递归整个表如果仅递归result,那么速度会加快不少,况且访问result是访问服务器内存.我们一般通过下面的语句使游标移动while($row=mysql_fetch_array($res))其原理是当mysql_fetch_array($res)每执行一次则游标自动下移,直到结束为止但是递归result时,我们只有一个result,当游标不定时,我们无法知道当前游标记录是否符合我们的要求php提供了一个函数让用户自己指定游标位置bool mysql_data

指针-插入排序的C递归实现,不知道哪里不对.

问题描述 插入排序的C递归实现,不知道哪里不对. #include#define N 5 //数组长度 int no_rec=0; //记录递归次数的变量void insert_sort(int );int main(){ int arr[N]={54321}; insert_sort(arr); for(int i=0;i<=N-1;i++) printf(""%d ""arr[i]); } void insert_sort(int *arr) //这个指针

PHP树-不需要递归的实现方法_php实例

PHP树-不需要递归的实现方法 /** * 创建父节点树形数组 * 参数 * $ar 数组,邻接列表方式组织的数据 * $id 数组中作为主键的下标或关联键名 * $pid 数组中作为父键的下标或关联键名 * 返回 多维数组 **/ function find_parent($ar, $id='id', $pid='pid') { foreach($ar as $v) $t[$v[$id]] = $v; foreach ($t as $k => $item){ if( $item[$pid] )

【算法】2 由股票收益问题再看分治算法和递归式

回顾分治算法 分治算法的英文名叫做"divide and conquer",它的意思是将一块领土分解为若干块小部分,然后一块块的占领征服,让它们彼此异化.这就是英国人的军事策略,但我们今天要看的是算法. 如前所述,分治算法有3步,在上一篇中已有介绍,它们对应的英文名分别是:divide.conquer.combine. 接下来我们通过多个小算法来深化对分治算法的理解. 二分查找算法 问题描述:在已排序的数组A中查找是否存在数字n. 1)分:取得数组A中的中间数,并将其与n比较 2)治: