目前正在学习《算法导论》和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)