基础排序算法二——插入排序

Posted 聊聊Java

tags:

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

基础排序算法二——插入排序

直接插入排序算法

视频: https://youtu.be/uMqVuEEWJv4 (需要翻墙观看)


直接插入排序(Straight Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。

源码(java 实现)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
* @author amosli
* @date 2018-06-11  15:02
*/
public class InsertionSort {

   public static void main(String[] args) {
       int[] array = new int[]{0, 5, 3, 4, 6, 2};
       sort(array);
   }

   static void sort(int[] array) {
       for (int i = 1; i < array.length; i++) {
           int temp = array[i];
           int j;
           for (j = i - 1; array[j] > temp; j--) {
               array[j + 1] = array[j];
           }
           array[j + 1] = temp;
       }
   }
}

直接插入排序为稳定排序,基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增加1的有序表。时间复杂度为O(n*n),辅助空间为O(1)。
基本思想:假设在排序过程中,记录序列R[1..n],将记录R[i]插入到有序子序列R[1..i-1]中,使记录的有序序列从R[1..i-1]变为R[1..i]。R[i]的插入过程就是完成排序中的一趟,随着有序序列的不断扩大,最终使全部有序,完成排列。
算法分析:要将R[i]插入到前面的有序序列中,只要将该记录的关键字与第i-1个记录开始的记录关键字进行比较,当它比前面的数小时,前面的记录顺序后移,否则将该记录存入该单元。在此,还要注意将R[i]临时存储到R[0]中暂存。

哨兵(监视哨)的作用:

  • 1.作为临时变量存放R[i]的副本。

  • 2.在查找循环中用来监视下标变量j是否越界。

算法效率:
时间复杂度最好的情况是已经排好序,比较次数为n-1,移动次数为0;
最坏的情况是反序时进行插入排序,平均的移动次数和比较次数都是O(n*n)。
空间复杂度为O(1)。

排序特点:

  • 1.是一种稳定的排序方法。

  • 2.适用于接近排好序的情况。

  • 3.适用于n较小的情况。

  • 4.直至最后一趟排序过程才能确定一个元素的最终位置。

    从空间来看,它只需要一个记录的辅助空间R[0];从时间来看,n个记录要进行n-1趟插入过程,每一趟都要进行与关键字的比较和记录的移动,但是比较的次数是不固定的。最好的情况是记录已经是排列有序的,则每一趟都只需要比较一次,就可以找到插入记录的位置,不需移动记录,复杂度为O(n);最坏情况是记录逆序存放,则每一趟都要与前面的关键字进行比较并移动记录,复杂度为O(n*n)。所以平均性能的复杂度为O(${n^2}$)。
    因此,直接插入排序算法非常适合记录基本有序且记录数不是很多的情形。

    当最坏的情况,即待排序表是逆序的情况,比如{6,5,4,3,2},此时需要比较sigma(i=2, n, i)=2+3+…+n=(n+2)(n-1)/2次,而记录的移动次数也达到最大值sigma(i=2, n, i+1)=(n+4)(n-1)/2次。

    如果排序记录是随机的,那么根据概率相同的原则,平均比较和移动次数约为n2/4次。因此,我们得出直接插入排序法的时间复杂度为O(n2)。从这里也看出,同样的O(${n^2}$)时间复杂度,直接插入排序法比冒泡和简单选择排序的性能要好一些。


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

冒泡选择插入排序算法——基础排序算法详解。

《算法零基础100例》(第38例) 基础排序 - 插入排序

数据结构与算法——基础篇

基础排序算法总结(代码+图片分析)

重温基础算法内部排序之插入排序法

基础排序算法···插入排序