插入排序和希尔排序

对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)
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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值