目录

插入排序

插入排序 O(n²)

插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。

插入排序的基本思想是:每步将一个待排序的记录,按其临时值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。

 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
import java.util.Arrays;

/**
 * @author: YunTaoChen
 * @description:
 * @Date: Create in
 * @Modified by:
 */
public class InsertSort {
    public static void main(String[] args) {
        int[] arr = new int[]{1, 6, 3, 7, 9, 2, 0};
        insertSort(arr);
        System.out.println(Arrays.toString(arr));
    }

    public static void insertSort(int[] arr) {
        int j = 0;
        int temp;
        //默认认为只有一个元素时,数组有序,从数组的第二个元素开始遍历,每一趟排序就会有一个元素有序
        for (int i = 1; i < arr.length; i++) {
            //如果当前数字比前一个数字小,就要把它向前放
            if (arr[i] < arr[i - 1]) {
                //取出当前的数作为临时数,保存并即将做插入操作
                temp = arr[i];
                //从当前数字前面一个元素开始遍历,因为是向前遍历,所以条件是j>=0和临时数字小于前面的数字才做操作,否则目前就是顺序排列
                for (j = i - 1; j >= 0 && temp < arr[j]; j--) {
                    //每次都把当前数给后一个位置,为临时值的插入腾出空间
                    arr[j + 1] = arr[j];
                }
                //temp放在合适的位置上
                arr[j + 1] = temp;
            }
        }
    }
}