减治法与插入排序

Posted 数学算法实验室

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了减治法与插入排序相关的知识,希望对你有一定的参考价值。

减治法


什么是减治法?

首先请大家想象这样一个场景,有数十本书杂乱无章散落在桌子上,现在需要你将它们叠放整齐,你会怎么做?大部分人也许会选择一本一本捡起并叠放在一个位置,这样很快就能将所有的书本叠放整齐。通俗而言,这就是减治法。

假如我们要对n本书进行整理,当已经有m本书叠放好以后,我们只需将n-m本书叠好即可解决问题。减治技术就是利用了一个问题给定实例的解和同样问题较小实例的解之间的某种关系。减治法有3种主要变种:

    ①减去一个常量

    ②减去一个常量因子

    ③减去一个可变规模


减常量变种    每次算法迭代总是从实例规模中减去一个常量,该常量一般为一,对应上面的例子也就是我们每次只捡起一本书叠放在某位置,此时我们也将之称为减㈠治技术。减二的情况有时也会发生,比如有时算法会根据实例规模为偶数或奇数的不同情况从而采取采取不同的处理方法。这还是比较好理解的。在此我们主要讨论减(一)治技术。例:n=(n-1)+1

减常因子变种    每次算法迭代总是从实例规模中减去一个固定常数因子,在大多数情景下通常将常因子取为二,即将原问题规模一分为二。例:n=(n/2)*2

减可变规模变种    每次算法迭代总是从实例规模中减去一个规模,规模减小的模式一般是不同的。例:求取最大公因数时所使用的辗转相除法:gcd(m,n)=gcd(n, m mod n).


 

插入排序

插入排序原理


在此我们考虑使用减(一)治技术来对一组数A[0,n-1]进行插入排序,可分为直接插入排序和折半插入排序。我们假设已经对数组中的n-1个数排好序,接下来则考虑如何将A[n-1]这个数放到已经排好序的n-1个数里,使得我们成功对n个数完成排序。直接插入排序和折半插入排序都可做到。前者有两种做法:一是从左到右扫描,直到找到第一个大于等于A[n-1]的元素A[i],然后将A[n-1]放到A[i]前面;二是从右到左扫描,直到找到一个小于等于A[n-1]的元素A[i],然后将A[n-1]放到A[i]后面。直接插入排序中使用第二种方法更为常见,相对而言其效率更高一些。折半插入排序是使用折半查找为A[n-1]在有序数组中找到一个合适的位置。


插入排序的平均性能相对较高,遇到基本有序的数组时表现出优异性能,相对而言优于选择排序和冒泡排序。


下面我们将给出一个使用插入排序的例子和代码,读者们可以根据这个例子仔细品味,并和之前所讲过的排序方法进行比较


插入排序算法实现

def InsertSort(p): length=len(p) for j in range(1,length): x=p[j] for i in range(j,-1,-1): if p[i-1]>x : p[i]=p[i-1] else : break p[i]=x return p
a=[9,7,13,6,4,25,37,18,91,24]print(InsertSort(a))

结果如下



以上就是今天的全部内容了,如果你喜欢的话,求关注求转发,你的支持是我最大的动力




参考书籍   《算法设计与分析基础》

审稿:呆呆

侵删

以上是关于减治法与插入排序的主要内容,如果未能解决你的问题,请参考以下文章

算法设计与分析减治法

算法与数据结构,你一定要知道的

教学篇教你轻松看懂插入排序

算法笔记_023:拓扑排序(Java)

减治法

主元素问题 减治法