Python 实现分治排序

目前正在学习《算法导论》和Python,想着用Python实现算法。首先写了两个排序的算法,分别为:1.插入排序。2.分治排序。下面简单介绍两种排序的思想。
1.插入排序:依次比较两个数之间的大小,若A小于B,则将A放于B前,再将C于B比较,依次下去知直到列表中的元素排好序。(小提示:循环的次数应该为列表长度-1)
代码如下:

#-*-coding:utf-8 -*-
def insert_sort1(list):
    l=len(list)
    for i in range(1,l):
        key=list[i]
        j=i-1
        while j>=0 and list[j]1]=list[j]
            j=j-1
        list[j+1]=key
    return list
#以下为测试代码
if __name__=='__main__':
    list=[5,3,7,9,10,2,6,1]
    print insert_sort(list)

以上为降序排序,若想得到升序,只需改变while的条件即可.

2.分治排序.
主要思想:将一个待排序的序列分成两段,每一段后面加一个哨兵值,用于提示排序比较完成。假设按升序排列,即第一个值最小。分别比较两个序列的第一个值,如:
要将序列[1,5,7,3,9,2,10,8,6,4,11,-4]排好
分为A=[1,5,7,3,9,2] , B=[10,8,6,4,11,-4]两个序列,比较A,B的第一个数值,A的小,则把A的数值放入空列表中,再将A的第二个数值与B的第一个比较,以此类推,直到遇到哨兵结束。
代码如下:

#-*- coding:utf-8 -*-
def Merge(list,p,r):
    q=(p+r)/2 #q为列表中间位置
    n1=q-p+1
    n2=r-q
    L=[]
    R=[]
    inf=float("inf") #inf为哨兵,为无穷大

    for i in range(0,n1):
        L.append(list[p+i-1])
    for j in range(0,n2):
        R.append(list[q+j])
    L.append(inf)
    R.append(inf) #此处要用append,因为Python不允许直接给列表赋值
    L.sort()
    R.sort()

    i=0
    j=0
    for k in range(p-1,r):
        #此处为p-1 ,是因为输出列表从当前位置输出,这是由于Python语言中的列表下标从0开始,不是从1开始
        if L[i]<=R[j]:
            list[k] = L[i]
            i=i+1

        else:
            list[k] = R[j]
            j=j+1
    return list

#以下的函数为递归,可简单参考,不属于上述函数
def MERGE_SORT(list,p,r):
    """
    此函数用于递归,将数序列细分至两个的比较,再进行合并,利用递归,进行序列的拆分
    """
    if p < r:
        q=(p+r)/2
        MERGE_SORT(list,p,q)
        MERGE_SORT(list,q+1,r)
        Merge(list,p,q,r)
    return list

l1=[1,5,7,3,9,2,10,8,6,4,11,-4]
if __name__=='__main__':
    print Merge(l1,1,12)

你可能感兴趣的:(python排序算法)