数据结构常见的八大排序算法之直接插入排序

                                   数据结构常见的八大排序算法之直接插入排序

 一、简述

        直接插入排序是一种最简单的排序算法,直接插入的算法基本思想是:仅有一个元素的序列总是有序的,因此,对n个记录的序列,可从第二个元素开始直接到第n个元素,逐个向有序序列中执行插入操作,从而得到n个元素按关键字有序的序列。一般来说,在含有j-1个元素的有序序列中插入一个元素的方法是:从第j-1个元素开始依次向前搜索应当插入的位置,并且在搜索插入位置的同时可以后移元素,这样当找到适当的位置时,即可插入元素。原理简述:顺序把待排序的数据元素按其关键字值的大小插入到已排序数据元素子集合的适当位置。

二、步骤展示

一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:

  1. 从第一个元素开始,该元素可以认为已经被排序
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描
  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置
  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
  5. 将新元素插入到该位置后
  6. 重复步骤2~5

三、时空复杂度

最好的情况下,即待排序序列按关键字已经有序排列,每趟操作只需1次或者0次移动

在最坏的情况下,即待排序序列按关键字逆排序序列,这时在第j趟操作中,为插入元素需要同前面的j个元素进行j次关键字比较,移动元素的次数为j+1次。此时有:总比较次数=n(n-1)/2次,总移动次数 = (n+2)(n-1)/2次

平均情况下:即在第j趟操作中,插入记录大约需要时间同前面的j/2个元素进行关键字比较,移动记录次数j/2+1次

直接插入排序的时间复杂度:O(n2)

空间复杂度:O(1),没有分配内存。

四、代码示例 

public class InsortSort {

    public static void sort(int[] a) {
        for (int i = 1; i < a.length; i++) {
            int num = a[i];
            int j;
            for (j = i; j > 0 && num < a[j - 1]; j--) {
                a[j] = a[j - 1];
            }
            a[j] = num;
        }
    }

    public static void main(String[] args) {
        int[] arr = {1, 3, 2, 5};
        for (int i : arr) {
            System.out.printf(" "+i);
        }
        System.out.println();
        sort(arr);
        for (int i : arr) {
            System.out.printf(" "+i);
        }
    }
}

 

你可能感兴趣的