插入排序算法解析

Posted 地中海程序员

tags:

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

点击上方“蓝字”关注我们吧!
插入排序算法解析

1 插入排序算法定义
插入排序算法解析

插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法 。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。(摘自百度百科)

简单理解就是类似摸扑克牌的一个过程


插入排序算法解析

插入排序算法解析

2 插入排序详细过程
插入排序算法解析

假定有一个数组:

*int*[] nums = *new int*[]{2, 4, 5, 1, 3, 6};

现在需要把它变为倒序排序。

倒叙排序代码如下:

public static void desc(int[] nums) {

   for (int i = 1; i < nums.length; i++) {

       for (int j = i; j > 0; j--) {

           if (nums[j] > nums[j-1]) {

               int temp = nums[j];

               nums[j] = nums[j-1];

               nums[j-1] = temp;

           } else {

               break;

           }

       }

   }

}


详细排序过程如下:

第一次比较,由于nums[1]小于nums[0],直接跳到break,结果为

[4, 2, 5, 1, 3, 6]

第二次比较,nums[2]=5大于nums[1]=2,  5和2交换位置,结果为: [4,5, 2, 1, 3, 6],这时由于j的值为1,所以会再执行一次子循环,这时nums[1]=5大于nums[0]=4,所以4和5交换位置,这时j的值为0,循环终止。结果为

[5, 4, 2, 1, 3, 6]

以此类推。。。

[5, 4, 2, 1, 3, 6]

[5, 4, 3, 2, 1, 6]

[6, 5, 4, 3, 2, 1]


插入排序算法解析

3 插入排序时间复杂度
插入排序算法解析

由上述代码可以看到,算法的核心是元素比较和元素交换,因此,算法的复杂度即为元素比较次数和元素交换次数的总和。

元素比较次数C为:

C=5+4+3+2+1=(n-1)+(n-2)+...+2+1=(1+(n-1)) * ( (n-1)/2 )=(n^2)/2-n/2=(n*(n-1))/2

元素交换次数M为比较次数的三倍:

M=(5+4+3+2+1)3=((n-1)+(n-2)+...+2+1)3=3(n^2)/2-3n/2=(3n*(n-1))/2

相加之后的结果S为:

S=(4n*(n-1))/2=2N^2-2N=O(n^2)

插入排序的时间复杂度为O(n^2)

不明白时间复杂度如何得来的参考另外一篇文章(时间复杂度O(n)是如何得来的?)


插入排序算法解析


4 结语
插入排序算法解析

感谢各位的阅读,如有问题,欢迎大家留言反馈,我会在第一时间修正。

如果觉得文章还可以的话,不妨点个关注吧!!!


插入排序算法解析

插入排序算法解析插入排序算法解析插入排序算法解析

查看其他文章
插入排序算法解析







END






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

实例 | Java 折半插入排序算法及解析

三大基础排序算法(冒泡排序,选择排序,插入排序)

算法排序算法之插入排序

通俗易懂-动态图解析插入排序快速排序

真香!10+图来解析C语言希尔排序

面试必备:经典算法动画解析之插入排序