您的位置:首页 > 其它

插入排序和希尔排序

2016-03-24 10:21 309 查看
对n个元素的数组排序,假设已经排好了前n-1个,一般来说,我们可以从右到左扫描这个有序的子数组,直到遇到第一个小于等于第n个元素的元素,然后把第n个元素插在该元素的后面。这种算法被称为直接插入排序,显然基于递归思想,但从底至上地实现这个算法,也就是使用迭代效率会更高。 stable

# insertion sort
def sort1(A):
n=len(A)
for i in range(1,n):
v=A[i]
j=i-1
while j>=0 and A[j]>v :
A[j+1]=A[j]
j=j-1
A[j+1]=v
return A

def sort2(A):
n=len(A)
for i in range(1,n):
j=i-1
while j>=0 and A[j]>A[j+1] :
A[j],A[j+1]=A[j+1],A[j]
j=j-1
return A


希尔排序是插入排序的一种扩展算法,以发明者(D.L.Shell)的名字命名,此排序方法提供了一种更好的算法来对较大的文件进行排序。它对给定的序列的若干步长子序列分别应用插入排序。对序列的每一遍操作,都根据一些事先定义好的递减步长队列 h1>h2>…>1来构造所要求的子序列。not stable

# -*- coding: utf-8 -*-
#shell sort step size 1,4,13,40,121,...
#4=1+3^1,13=4+3^2,40=13+3^3,121=40+3^4,...
#setpsize=[1,4,13,40,121,]

def sort(A):
n=len(A)
ss=stepsize(n)
for k in range(len(ss)):
step=ss[len(ss)-k-1]
for m in range(0,step):
for i in range(1,n/step+1):
j=(i-1)*step+m
while j>=0 and j+step < n and A[j]>A[j+step] :
A[j],A[j+step]=A[j+step],A[j]
j=j-step
return A

def stepsize(n):
ss=[]
ss.append(1)
i=1
while ss[i-1]+3**i < n :
ss.append(ss[i-1]+3**i)
i=i+1
return ss


附:检验程序性能

import random
import cProfile
import selectionsort
import bubblesort
import insertionsort
import shellsort
list1=range(10000)
random.seed(111<
4000
/span>)
random.shuffle(list1)
cProfile.run('selectionsort.sort(list1)')
list1=range(10000)
random.seed(111)
random.shuffle(list1)
cProfile.run('bubblesort.sort(list1)')
list1=range(10000)
random.seed(111)
random.shuffle(list1)
cProfile.run('insertionsort.sort1(list1)')
list1=range(10000)
random.seed(111)
random.shuffle(list1)
cProfile.run('shellsort.sort(list1)')
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: