插入排序(Insertion Sort)

Posted ConstXiong

tags:

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

思路:

  • 将数组分为两个区域:已排序、未排序。

  • 初始已排序区域只第一个元素

  • 取未排序的区域的元素,在已排序的区域找到合适的位置插入

  • 保证已排序区域的数据一直有序

  • 重复这个过程,直到未排序区域为空


步骤:

  • 从数组第二个数开始,往后逐个取数,跟前面的数进行比较

  • 当所取的数,比前面的数大,停止比较,取一下个进行比较

  • 当所取的数,比前面的数小,把比所取数大的数都往后挪一个,直到所取数大于被比较的数停止,最后把所取数插入到比它小的数的右边


代码:

package constxiong.interview.algorithm;
/** * 插入排序 * @author ConstXiong * @date 2020-04-08 09:35:40 */public class InsertionSort {
public static void main(String[] args) { int [] array = {33, 22, 1, 4, 25, 88, 71, 4}; insertionSort(array); }
/** * 插入排序 */ private static void insertionSort(int[] array) { print(array); for (int i = 1; i <array.length; i++) { int j = i - 1; int value = array[i]; for (; j >= 0; j--) { if (array[j] > value) { array[j+1] = array[j]; } else { break; } } array[j+1] = value; print(array); } }
/** * 打印数组 * @param array */ private static void print(int[] array) { for(int i : array) { System.out.print(i + " "); } System.out.println(); }
}


打印:

33 22 1 4 25 88 71 4 22 33 1 4 25 88 71 4 1 22 33 4 25 88 71 4 1 4 22 33 25 88 71 4 1 4 22 25 33 88 71 4 1 4 22 25 33 88 71 4 1 4 22 25 33 71 88 4 1 4 4 22 25 33 71 88


特征:

  • 最好情况时间复杂度:O(n) 。即数组本身有序,如 1,2,3,4,5

  • 最坏情况时间复杂度:O(n2) 。即数组本身完全逆序,如 5,4,3,2,1

  • 平均时间复杂度:O(n2) 。在数组中插入一个数据的平均时间复杂度是 O(n),插入排序执行 n 次往数组中插入操作,所以平均时间复杂度是 O(n2)

  • 空间复杂度是 O(1)。是原地排序

  • 可以保持相等的值原有的前后顺序不变,是稳定排序


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

插入排序算法(insertion-sort)

经典排序算法 – 插入排序Insertion sort

排序算法-插入排序(insertion sort)

插入排序(Insertion Sort)

插入排序Insertion sort

经典排序算法 – 插入排序Insertion sort