在遍历某一个数字的时候,认为前面的数据都是已经排好序了的,挨个跟前面的数字比较,在合适的地方插入这个数据

从第2个数开始排序就可以

原理演示如下:

 

clip_image002

3比5小,则交换顺序

clip_image004

clip_image006

clip_image008

clip_image010

clip_image012

4比5小,4跟5交换位置

4比3大,则插入原来5所在的位置

clip_image014

clip_image016

clip_image018

7比5大,则下标直接后移

clip_image020

1比7小,7向后移1位

1比5小,5向后移1位

1比4小,4向后移1位

1比3小,3向后移1位

到头了,把1赋给第一个数字

clip_image022

下标向后移

clip_image024

2比7小,7向后移1位

2比5小,5向后移1位

2比4小,4向后移1位

2比3小,3向后移1位

2比1大,2就放在原来3的位置上

clip_image026

clip_image028

8比7大,下标直接后移,到头了,排序结束

 

import java.util.Arrays;

//插入排序
public class InsertSort {
    public static void main(String[] args) {
        int[] arr = { 5, 3, 2, 8, 5, 0, 1, 9 };
        System.out.println(Arrays.toString(arr));
        arr = InsertSort.insert(arr);
        System.out.println(Arrays.toString(arr));
    }

    public static int[] insert(int[] arr) {
        for (int i = 1; i < arr.length; i++) {
            // 如果当前数字比前一个数字小
            if (arr[i] < arr[i-1]) {
                int temp = arr[i];
                int j ;
                // 用一个for循环,遍历arr[i]前面所有的数
                for (j = i-1; j>=0 && arr[j]>temp; j--) {//注意j>=0
                    //把前一个数赋给后一个数
                    arr[j+1] = arr[j];
                }
                //直到不满足循环条件,要么是到头了,要么找到了自己的位置
                //把temp赋值给arr[j+1]
                arr[j+1]=temp;
            }
        }
        return arr;
    }

}

输出

[5, 3, 2, 8, 5, 0, 1, 9]
[0, 1, 2, 3, 5, 5, 8, 9]
posted on 2019-03-31 17:04  源格  阅读(178)  评论(0编辑  收藏  举报