插入排序(扫盲)

说到插入排序,先引用维基百科上的一段话,来对其描述:

插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。        ——quote from wikipedia (http://zh.wikipedia.org/wiki/%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA%8F)

对插入排序有了一个基本的了解后,下面以升序排列无序数组 {3,5,1,4,6,8} 为例,对插入排序的具体步骤进行说明。

具体步骤:

1.将无序数组按“有序”和“无序”分成前后两个部分。

有序:{}       无序:{3,5,1,4,6,8}

2.将数组的无序部分的第一个数,升序插入到数组有序部分的合适位置(所谓的“插入”,是要伴随着数组中数据的互换操作)。

插入后:有序:{3}        无序:{5,1,4,6,8}

3.循环第二步,直到数组全部有序。

将数组的无序部分的第一个数( 5 ) ,升序插入到数组有序部分的合适位置 (3 的后面):

插入后:有序:{3,5}        无序:{1,4,6,8}

将数组的无序部分的第一个数 ( 1 ),升序插入到数组有序部分的合适位置 (3 的前面):

插入后:有序:{1,3,5}        无序:{4,6,8}

将数组的无序部分的第一个数 ( 4 ),升序插入到数组有序部分的合适位置 (3 和 5 之间):

插入后:有序:{1,3,4,5}        无序:{6,8}

将数组的无序部分的第一个数 ( 6 ),升序插入到数组有序部分的合适位置 (5 的后面):

插入后:有序:{1,3,4,5,6}        无序:{8}

将数组的无序部分的第一个数 ( 8 ),升序插入到数组有序部分的合适位置 (6 的后面):

插入后:有序:{1,3,4,5,6,8}        无序:{}

Java语言算法实现


//对无序数组进行插入排序操作.
public static void sort(int[] arr){ 
        //循环次数与数组长度相同,每循环一次,进行一次插入操作.
		for(int i=1;i
   
   
    
    =0 && arr[j]>temp){   
				arr[j+1] = arr[j];
				j--;
			}
			//将temp值插入合适的位置
			arr[j+1] = temp;
		}
	}

   
   


接着引用维基百科上的一段话,对插入排序算法的时间复杂度进行说明:

如果目标是把n个元素的序列升序排列,那么采用插入排序存在最好情况和最坏情况。最好情况就是,序列已经是升序排列了,在这种情况下,需要进行的比较操作需(n-1)次即可。最坏情况就是,序列是降序排列,那么此时需要进行的比较共有n(n-1)/2次。插入排序的赋值操作是比较操作的次数减去(n-1)次。平均来说插入排序算法复杂度为O(n2)。因而,插入排序不适合对于数据量比较大的排序应用。但是,如果需要排序的数据量很小,例如,量级小于千,那么插入排序还是一个不错的选择。 插入排序在工业级库中也有着广泛的应用,在STL的sort算法和stdlib的qsort算法中,都将插入排序作为快速排序的补充,用于少量元素的排序(通常为8个或以下)。         ——quote from wikipedia (http://zh.wikipedia.org/wiki/%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA%8F


reference:

1.《Algorithms》(中文版)Robert Sedgewick , Kevin Wayne 著,谢路云 译        P157~P159

2.百度百科:http://baike.baidu.com/view/396887.htm

3.维基百科:http://zh.wikipedia.org/wiki/%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA%8F


/*
  1.本文为原创技术文章,首发CSDN个人站点(http://blog.csdn.net/u011429947)。
  2.所做文章仅用于相互学习和交流,转载请注明作者及出处。
  3.由于个人能力有限,错误之处在所难免,如能指出,非常感谢。
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值