一:概念
插入排序(英文为Insertion sort ): 插入排序是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
二:原理
一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:
· 从第一个元素开始,该元素可以认为已经被排序
· 取出下一个元素,在已经排序的元素序列中从后向前扫描
· 如果该元素(已排序)大于新元素,将该元素移到下一位置
· 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
· 将新元素插入到该位置后
· 重复步骤2~5
如果比较操作的代价比交换操作大的话,可以采用二分查找法来减少比较操作的数目。该算法可以认为是插入排序的一个变种,称为二分查找排序。
In-place 简单理解:排序通常是在原地。 k次迭代后得到的数组,其中第k +1项进行排序的属性。在每次迭代中对输入的所述第一剩余条目被删除,在正确的位置插入的结果,从而延长了结果:
排序前:
排序后:
例子:流程图形式
总上所述:插入排序是把数组分两个子数组,第一子数组(通常是左边的数组)是排过序的,第二个子数组是没有排序的。
三:特点
· Simple implementation
· Efficient for (quite) small data sets
· Adaptive (i.e., efficient) for data sets that are already substantially sorted: the time complexity is O(n + d), where d is the number of inversions
· More efficient in practice than most other simple quadratic (i.e., O(n2)) algorithms such as selection sort or bubble sort; the best case (nearly sorted input) is O(n)
· Stable; i.e., does not change the relative order of elements with equal keys
· In-place; i.e., only requires a constant amount O(1) of additional memory space
· Online; i.e., can sort a list as it receives it
· 实现简单
· 对于小型数据集效率很高
· 自适应(即有效),为那些已经大幅排序的数据集:时间复杂度为O(N + D),其中d是反转的数目
· 在实践中更有效地比大多数其他简单的二次(即,O(N2))算法,如选择排序、冒泡排序;最好的情况下(近排序的输入)为O(N)
· 稳定性;即,不改变元素的相对顺序。
· 到位;即,只需要一定量的O(1)的额外的存储空间
· •在线;即,可以对列表排序,因为它接收它
四:JAVA如何实现归并排序
public class InsertionSort { public static void insertionSort(Comparable []data){//升序排序方法 for(int index=1;index<data.length;index++){ Comparable key = data[index]; int position = index; //shift larger values to the right while(position>0 && data[position-1].compareTo(key)>0){ data[position] = data[position-1]; position--; } data[position]=key; } } public static void insertionSort(int[] num){ //降序排序方法 int j; //到目前已排序的元素数 int key; //要被插入的元素 Key int i; for (j = 1; j < num.length; j++) //从1开始不是0 { key = num[ j ]; for(i = j - 1; (i >= 0) && (num[ i ] < key); i--) // 元素小的正在移动... { num[ i+1 ] = num[ i ]; } num[ i+1 ] = key; //把元素key放在适当的位置 } } public static void main(String []args){ Comparable[] c ={4,9,23,1,45,27,5,2}; insertionSort(c); for(int i=0;i<c.length;i++) System.out.print(" "+c[i]); System.out.println(); int[] cc = {4,9,23,1,45,27,5,2}; insertionSort(cc); for(int i=0;i<cc.length;i++) System.out.print(" "+cc[i]); } }
五:算法复杂度
空间复杂度O(1)
时间复杂度O(n2)
最差情况:反序,需要移动n*(n-1)/2个元素
最好情况:正序,不需要移动元素
如果目标是把n个元素的序列升序排列,那么采用插入排序存在最好情况和最坏情况。最好情况就是,序列已经是升序排列了,在这种情况下,需要进行的比较操作需(n-1)次即可。最坏情况就是,序列是降序排列,那么此时需要进行的比较共有n(n-1)/2次。插入排序的赋值操作是比较操作的次数减去(n-1)次。平均来说插入排序算法复杂度为O(n2)。
因而,插入排序不适合对于数据量比较大的排序应用。但是,如果需要排序的数据量很小,例如,量级小于千,那么插入排序还是一个不错的选择。 插入排序在工业级库中也有着广泛的应用,在STL的sort算法和stdlib的qsort算法中,都将插入排序作为快速排序的补充,用于少量元素的排序(通常为8个或以下)。
参考资料:
http://zh.wikipedia.org/wiki/%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA%8F
http://blog.csdn.net/cjf_iceking/article/details/7916194
http://www.cnblogs.com/fanyong/archive/2012/03/23/2413553.html
http://www.cnblogs.com/Clingingboy/archive/2011/09/12/2174140.html
https://www.princeton.edu/~achaney/tmve/wiki100k/docs/Insertion_sort.html
http://mathbits.com/MathBits/Java/arrays/InsertionSort.htm
相关推荐
python python_十大排序算法之插入排序
C++排序算法之插入排序
实现以下常用的内部排序算法并进行性能比较:"直接插入排序"," 折半插入排序"," 2—路插入排序"," 表插入排序"," 希尔排序"," 起泡排序"," 快速排序"," 简单选择排序"," 树形选择排序"," 堆排序"," 归并排序"," 链式...
C语言基本排序算法之插入排序与直接选择排序实现方法 C语言基本排序算法之插入排序与直接选择排序实现方法是计算机科学中最基本的排序算法之一。排序算法是指将一组无序的数据按照一定的规则排列成有序的序列的过程...
"C语言排序算法之插入排序" 插入排序是C语言中的一种常用的排序算法,它的实现思路是将一个数组分成已排序和未排序两部分,然后逐步将未排序部分的元素插入到已排序部分中,直到整个数组都被排序。 InsertSort函数...
2. 冒泡排序:是最简单的排序算法之一,通过不断交换相邻位置的元素来逐渐达到排序的目的。每一轮遍历都能确保最大(或最小)的元素被放置到正确的位置,重复这个过程直到整个数组排序完成。 3. 选择排序:每次从未...
本话题主要探讨六种内部排序算法:直接插入排序、希尔排序、冒泡排序、快速排序、选择排序以及堆排序。这六种排序算法各有优劣,适用于不同的场景,接下来我们将逐一进行详细阐述。 1. **直接插入排序**: 直接...
快速排序是C++中最常用的排序算法之一,由英国计算机科学家C.A.R. Hoare提出。它使用分治策略,选择一个基准元素,将数组分为两部分,一部分的所有元素都小于基准,另一部分的元素都大于基准,然后递归地对这两部分...
Hoare在1960年提出,是目前最常用的排序算法之一。它的基本思想是“分而治之”:选择一个基准元素,将数组分为两部分,一部分的所有元素都小于基准,另一部分的所有元素都大于基准,然后对这两部分再分别进行快速...
本篇文章将详细讨论几种常见的排序算法:选择排序、冒泡排序、插入排序、合并排序以及快速排序,分析它们的算法原理、时间效率,并通过经验分析验证理论分析的准确性。 **1. 选择排序(Selection Sort)** 选择排序...
算法之插入排序
直接插入排序是一种基础且简单的排序算法,它的工作原理类似于我们日常生活中的整理扑克牌。在Java中实现这个算法,我们可以从以下几个关键知识点入手: 1. **基本思想**:直接插入排序是通过构建有序序列,对于未...
- 直接插入排序是最基础的排序算法之一,它的工作原理类似于人们手动整理扑克牌。首先,数组中的第一个元素被当作已排序的部分,然后逐个将后续元素插入到已排序的序列中,保持序列的有序性。 - 在排序过程中,每...
冒泡排序是最基础的排序算法之一,通过重复遍历待排序序列,比较相邻元素并交换位置来实现排序。如果前一个元素大于后一个元素,它们就会交换位置,这样最大的元素会逐渐"冒泡"到序列末尾。时间复杂度为O(n^2)。 2...
综上所述,插入排序是计算机科学中基础且重要的排序算法之一,理解和掌握它的原理和实现方式对提升编程技能具有重要意义。通过算法可视化,我们可以更好地学习和传授这种排序方法,加深对算法本质的理解。
本篇将详细阐述标题和描述中提到的几种线性表排序算法,包括插入排序、希尔排序、冒泡排序、快速排序、堆排序以及归并排序。 1. **插入排序**: 插入排序是一种简单直观的排序算法,它的工作原理是通过构造一个...
在这一大类排序算法中,有三种常见的实现方式:直接插入排序、希尔排序和折半插入排序。 ### 1. 直接插入排序 直接插入排序是最基础的插入类排序,其步骤如下: 1. 将序列中的第一个元素视为已排序部分。 2. 从第...
在JavaScript编程中,排序算法是数据处理中非常基础且重要...总的来说,`js代码-排序算法之插入排序`这个主题涵盖了基础的编程概念、排序算法原理以及JavaScript实现,对于理解和应用排序算法在实际项目中非常有帮助。