麻省理工《算法导论》公开课学习笔记【1】

最近在看麻省的《算法导论》公开课(以网易公开课为准),准备就学习体会和相关的编程练习写一篇连载。

简要说一下,语言希望能够都使用python。大多数的算法练习资料都是用C/C++,而且好多公司也要求是C/C++的实现。前段时间一直在用PYTHON,而且也仔细看了些书。

我觉得python还是很不错的语言,语法简要,风格优美。

另外一方面,python的适用性很强,你可以用它开发客户端,也可以写服务端。有时候我常常为自己学习的语言混杂(js、C#、C/C++、php、bash等)而苦恼,我现在希望能够只专注于python的应用。而把精力更多放在一些更深入的内容中,例如机器学习和数据处理等的研究。

---- 引言

第一课主要是讲排序算法和算法性能的一些评估方法和标记。

由于前期没有做很好的准备,笔记不多,现在只给出插入排序和归并排序的算法实现。

1.开发和测试环境说明如下:


程序语言:python 2.7

IDE:ulipad(如果有朋友在安装ulipad出现问题时可以联系我,我之前在win7下用ulipad使用没有,换成xp后竟然安装碰到点问题,索性解决了。)


2.关键笔记

插入排序的时间复杂度是O(n*n),

归并排序的时间复杂度是O(n lg n)。

3. 算法实现

#!/usr/bin/env python
#coding:utf-8

import sys

"""
    This file provide the program of insertion sort
    and merge sort
    @author:xiaoyongpeng
    @date:2012-11-28
"""

def InsertSort(numList):
    len_list = len(numList)
    if not len(numList):
        print  "list must not be null."
        return None
    for j in range(1,len_list):
        temp = numList[j]
        i = j-1
        while i >=0 and numList[i+1] < numList[i]:
            numList[i+1] = numList[i]
            numList[i] = temp
            i -= 1
    return numList


"""
Augrment:
    num : must be float type
"""
def Ceil(num):
    if float(num) - int(num) > 0:
            return int(num)+1
    else:
        return int(num)

    
def MergeSort(numList):
        if len(numList) <= 1:
            return numList
        else:
            half = float(len(numList))/2
            half = Ceil(half)
            
             
            
            numList_first = numList[:half]
            numList_second = numList[half:]
            
            numList_last = []
            
            #print "[%d] %s,%s" % (half,numList_first,numList_second),
           
            numList_first = MergeSort(numList_first)
            numList_second = MergeSort(numList_second)
            
            while numList_first or numList_second:
                if numList_first and numList_second:
                    if numList_first[0] <= numList_second[0]:
                        numList_last.append(numList_first.pop(0))
                    else:
                        numList_last.append(numList_second.pop(0))
                else:
                    numList_last += numList_first if numList_first \
                                    else numList_second
                    break
            #print numList_last 
            return numList_last


if __name__ == '__main__':
    num_list = []
    input_num = raw_input("please input an numList \
and seperated by ',':")
    if input_num:
        temp_list = input_num.strip().split(',')
        try:
            num_list = [int(x) for x in temp_list]
        except ValueError,args:
            print str(args)
            sys.exit(0)
        
    CMD = {'i':InsertSort,'m':MergeSort}
    printInfo = """Please choose your command:
        (i)nsertion sort
        (m)erge sort
        (q)uit
    """
    while True:
        cmd_input = raw_input(printInfo).strip().lower()
        if not cmd_input in 'imq':
            print "Please reinput your command."
            continue
        elif cmd_input == 'q':
            print 'quit now.'
            break
        else:
            #注意列表的赋值操作默认是使用浅拷贝方式
            #例如num_last = num_list指向的引用的对象是一致的
            num_last = [x for x in num_list]
            num_last = CMD[cmd_input](num_last)
            print "First:",num_list
            print "Last:",num_last

你可能感兴趣的:(麻省理工《算法导论》公开课学习笔记【1】)