插入排序和希尔排序

来源:互联网 发布:金碟软件 编辑:程序博客网 时间:2024/05/16 07:47

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

# insertion sortdef 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 Adef 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 Adef 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 cProfileimport selectionsortimport bubblesortimport insertionsortimport shellsortlist1=range(10000)random.seed(111)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)')
0 0
原创粉丝点击