Insertion Sort (插入排序)
Yuxuan Wu Lv13

介绍

插入排序(Insertion sort)是一种简单直观且稳定的排序算法。

插入排序的工作方式非常像人们排序一手扑克牌一样。开始时,我们的左手为空并且桌子上的牌面朝下。然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置。为了找到一张牌的正确位置,我们从右到左将它与已在 手中的每张牌进行比较,如下图所示:

image-20210713124149800

img

需求:

排序前:{4,3,2,10,12,1,5,6}

排序后:{1,2,3,4,5,6,10,12}

排序原理:

1.把所有的元素分为两组,已经排序的和未排序的;

2.找到未排序的组中的第一个元素,向已经排序的组中进行插入;

3.倒叙遍历已经排序的元素,依次和待插入的元素进行比较,直到找到一个元素小于等于待插入元素,那么就把待插入元素放到这个位置,其他的元素向后移动一位;

image-20210713124235447

Java的简单数组实现

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
package sorting;

import java.util.Arrays;

public class InsertionSort {
/**
* @param nums 数组
* @return sort完毕的数组
*/
public static void insertionSort(int[] nums) {
for (int i = 1; i < nums.length; i++) {
// 从第二个元素开始,确定插入的位置
int insertIndex = i - 1;

// 定义当前扫描得到的元素
int curr = nums[i];

// 从后向前比较插入元素和扫描得到的大小,如果大说明仍然需要向前
while (insertIndex >= 0 && curr < nums[insertIndex]) {
swap(nums, insertIndex, insertIndex + 1);
insertIndex--;
}
}

}

public static void swap(int[] nums, int a, int b) {
int temp;
temp = nums[a];
nums[a] = nums[b];
nums[b] = temp;
}

public static void main(String[] args) {
int[] testArray1 = {1, 7, 11, 0,23,12, 2120, 2, 3, 6, 5, 6};
int[] testArray2 = {1, 7, 11, 0,23,12, 2120, 2, 3, 6, 5, 6};

insertionSort(testArray1);
System.out.println(Arrays.toString(testArray1));

Arrays.sort(testArray2);
System.out.println(Arrays.toString(testArray2));

}
}

Java利用comparable接口来实现排序

image-20210713124319206

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
package cn.itcast.algorithm.sort;

public class Insertion {
/*
对数组a中的元素进行排序
*/
public static void sort(Comparable[] a){
for(int i=1;i<a.length;i++){

for(int j=i;j>0;j--){
//比较索引j处的值和索引j-1处的值,如果索引j-1处的值比索引j处的值大,则交换数据,如果不大,那么就找到合适的位置了,退出循环即可;
if (greater(a[j-1],a[j])){
exch(a,j-1,j);
}else{
break;
}
}

}
}

/*
比较v元素是否大于w元素
*/
private static boolean greater(Comparable v,Comparable w){
return v.compareTo(w)>0;
}

/*
数组元素i和j交换位置
*/
private static void exch(Comparable[] a,int i,int j){
Comparable temp;
temp = a[i];
a[i]=a[j];
a[j]=temp;
}
}

算法的performance

T(n) = O()

  • Post title:Insertion Sort (插入排序)
  • Post author:Yuxuan Wu
  • Create time:2021-07-13 00:47:23
  • Post link:yuxuanwu17.github.io2021/07/13/2021-07-10-Insertion-Sort-(插入排序)/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.