![596e7050908d195d116625fc9e41efc8.png](https://img-blog.csdnimg.cn/img_convert/596e7050908d195d116625fc9e41efc8.png)
插入排序思想:减治法。
这个思想大致就是把一个大问题划分为许多同等规模的小问题,然后利用小问题解得到整个问题解。
假设要对一个a[0……n]的数组进行排序,假设a[0……n-1]是有序的,只需要把第a[n]个插入到a[0……n-1]合适的位置,从右往左扫描a[0……n-1]直到遇到第一个小于等于a[n]的位置为止就将a[n]插入其后。
减治法在插入排序里体现就是假设a[0]是有序的,然后比较a[0] a[1],将a[1]插入前面正确位置,然后a[0……1]是正序的,找到a[2]在a[0……1]里正确的位置,以此类推到a[0……n]
半伪代码:
0 insertionSort(int a[0……n-1])
1 {
2 int i,j,v;
3 for(i=1;i<=n-1;i++)
4 {
5 v=a[i];//当前要被插入的值
6 j=i-1;//
7 while(j>=0&&a[j]>v)//如果前面的大于v则元素值一直后移腾出位置
8 {
9 a[j+1]=a[j];
10 j--;
11 }
12 a[j+1]=v;//插入正确的位置
13 }
14 }
其实按照它的算法思想,这个代码还有很多别的实现方式,比如7-12行主要完成的就是在有序序列不断比较找到v正确的位置,它用的都是数据移动没有明显交换。我写过用交换的但是很麻烦代码行数多还没有这个简洁。
你们可以和下面这个比较一下,算算时间效率。下面是真的伪码。。
InsertSort(a[0……n-1])
{
for i<-1 to n-1 do
j=i-1;
while j>=0anda[j]>a[j+1]do
swap(a[j],a[j+1]);
j--;
}
至于它的算法时间复杂度 空间复杂度分析暂时不是这本书分析重点随便说说……
比较好的情况下是输入的是有序序列那时间复杂度就是O(N),平均情况下还是o(n^2).
以上参考:《算法设计与分析基础》第三版P103
《数据结构与算法分析C语言描述》P180
如果不小心误人子弟了,概不负责。仅仅个人记录所学。排版这么丑怪知乎,没有五颜六色怪知乎,你没有看懂怪你自己。欢迎讨论,不能说我0-0