插入排序和希尔排序
来源:互联网 发布:金碟软件 编辑:程序博客网 时间: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
- 插入排序和希尔排序
- 插入排序和希尔排序
- 插入排序和希尔排序
- 插入排序和希尔排序
- 插入排序和希尔排序
- 插入排序和希尔排序
- 插入排序和希尔排序
- 插入排序和希尔排序
- 插入排序和希尔排序
- 插入排序和希尔排序
- 插入排序和希尔排序
- 插入排序和希尔排序
- 希尔排序和插入排序
- 插入排序和希尔排序
- 插入排序和希尔排序
- 插入排序和希尔排序
- 插入排序和希尔排序
- 插入排序和希尔排序
- 每天一个linux命令(1):which命令
- html dom教程
- 状态类和混合类(思想)(转载)
- Mysql 查看连接数,状态
- 响应式编程的概念
- 插入排序和希尔排序
- GMM的EM算法实现
- CSS自动换行、强制不换行、强制断行、超出显示省略号
- Linux shell 变量 数学 运算
- 我们是驴还是主人
- XPath 教程
- Android - day three 四大组件之 广播(broadcast reciver)
- 博客迁移
- 人脸识别 cam