Algorithm Insertion Sort

Insertion sort iterates, consuming one input element each repetition, and growing a sorted output list. At each iteration, insertion sort removes one element from the input data, finds the location it belongs within the sorted list, and inserts it there. It repeats until no input elements remain.

前言

    插入排序(Insertion sort)是一种简单直观且稳定的排序算法。如果有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,算法适用于少量数据的排序,时间复杂度O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。

插入排序

插入排序思想:

插入排序(InsertionSorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。

插入排序解析:


插入排序动图:


插入排序代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/**
* @Auther: Arsenal
* @Date: 2020-03-17 22:02
* @Description: 插入排序
*/
public class InsertionSort {
public static void main(String[] args) {
// int[] arr = {101, 34, 119, 1};
// System.out.println("原始的数组:" + Arrays.toString(arr));

int[] arr = new int[80000];
for (int i = 0; i < 80000; i++) {
arr[i] = (int) (Math.random() * 80000);
}
long start = System.currentTimeMillis();
insertionSort(arr); //608 毫秒
long end = System.currentTimeMillis();
System.out.println("80000个数字排序所用时间:" + (end - start));
}

/**
* 插入排序方法
* @param arr 需排序数组
*/
public static void insertionSort(int[] arr) {

int insertVal = 0;
int insertIndex = 0;

for (int i = 1; i < arr.length; i++) {
insertVal = arr[i];
insertIndex = i - 1; //即arr[i+1] 前的下标

//insertIndex>=0 保证下标不越界
//insertVal<arr[insertIndex] 说明前面有序数组还有更小的值
while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
arr[insertIndex + 1] = arr[insertIndex];
insertIndex--;
}

//当退出循环时,说明位置找到
if (insertIndex + 1 != i) { //优化,不在原来位置时才交换魏则
arr[insertIndex + 1] = insertVal;
}

// System.out.println("第" + i + "趟排序后的数组:");
// System.out.println(Arrays.toString(arr));
}
}
}

延伸

    插入排序
    Insertion Sort
    插入排序(Insertion Sort)
    排序-插入排序(Insertion Sort)
    韩顺平数据结构和算法

Content
  1. 1. 前言
  2. 2. 插入排序
  3. 3. 延伸