zoukankan      html  css  js  c++  java
  • algorithm -- 插入排序

    插入排序是《算法导论》中第一个介绍的算法,详细分析了插入排序的原理,执行过程,证明了算法的正确性。同时也引出了算法分析和算法分析常用的方法。

    此文对原文作个转述,检验学到的知识。

    文中使用了伪代码写出了插入排序的执行过程,在这里用C++重写:

    void insertSort( int * arr, int count )
    {
    	if( arr == nullptr || count == 0 )
    	{
    		return;
    	}
    	for( int i = 0; i < count; i++ )
    	{
    		int tem = arr[ i ];
    		int j = i;
    		while( j > 0 && tem > arr[ j - 1 ] )
    		{
    			arr[ j ] = arr[ j - 1 ];
    			--j;
    		}
    		arr[ j ] = tem;
    	}
    }
    

    插入排序类似于许多人打扑克摸牌的整理方法一样,每次从桌面上摸起一张,与原有的牌比较,播放正确的位置,这样无论何时,手中的牌总下排好序的。

    《导论》中使用循环不变式证明插入排序的正确性

    循环不变式有三个性质:

    • 初始化:循环开始时应该是正确的
    • 保持:循环在某一次迭代开始之前是正确的,那么下一次迭代开始之前,它也是应该保持正确
    • 终止:当循环结束时,不变式给了我们一个有用的性质,它有助于表明算法是正确的
      前两个性质成立时,就能保证循环不变式在每一论迭代开始之前,都是正确的。这是数学归纳法相似,只是多了终止。

    《导论》是这么说的,怎么理解、使用,则需要实践和验证。
    我理解的循环不变式的第二条是:在前一次操作正确的情况下,保证本次操作正确。这也应该是算法设计中的重点。
    拿上面的算法来实践下循环不变式

    int * arr, int count
    

    输入待排序的数组指针和数组大小,在本例中正在排序的元素前是排序好的(相当于手中的扑克),后是未排序的(相当于桌面的牌),tem 保存中间量

    • 初始化:当 i = 0; 时,排序好的是arr[0],正在排序的也是arr[0],此时已经排好序了。

    • 保持:第_i_个元素排序时,前面arr[0]~arr[i-1]是排好序的,进入_while_循环为_i_排序,这里得保证排序正确,不然下次排序的前提条件是错误的,算法也就错误了。那么来看下_while_循环做了什么:
      首先 j = i,从排序好的部分尾部开始,向前比较每一个元素大小,当第_i_个元素大于第_j-1_个元素时arr[ j ] = arr[ j - 1 ];即将排序好(小于第_i_个元素)的数向后移,当条件不成立时循环结束,第_i_个元素插入到_j_的位置,此时数组中arr[0]~arr[i]是排序好的,下次迭代前正确

    • 终止:当i == count;时循环终止,数组的前_i-1_个数是排序好的,而数组大小为 conut 个,数组最后一个元素的下标是 conut-1 等于此时的 i-1 ,所以此时数组已排好序了,算法正确。

    好了此时能条理清晰的说明插入排序是正确的,已经有点吃力了,后面的算法分析就放到后面再讨论,先抄一段:

    • 算法分析是指对算法所需要的资源进行预测,内存、通信带宽或计算机硬件资源以及时间等
    • 算法分析主要考察的最坏情况
    • 算法的增长量级

    algorithm wiki GitHub cat

    作者:H·K
    出处:http://www.cnblogs.com/pythian/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    如果文中有什么错误,欢迎指出。以免更多的人被误导。
  • 相关阅读:
    python 枚举enum
    python lambda 三元表达式
    python修改类属性
    python获取引用对象的个数
    python 返回实例对象个数
    python __del__() 清空对象
    python面向对象:继承
    python面向对象:多态
    Docker容器和K8s添加Health Check
    mkfs.xfs: /dev/vdb appears to contain a partition table (dos)
  • 原文地址:https://www.cnblogs.com/pythian/p/4721674.html
Copyright © 2011-2022 走看看