在遍历某一个数字的时候,认为前面的数据都是已经排好序了的,挨个跟前面的数字比较,在合适的地方插入这个数据
从第2个数开始排序就可以
原理演示如下:
3比5小,则交换顺序
4比5小,4跟5交换位置
4比3大,则插入原来5所在的位置
7比5大,则下标直接后移
1比7小,7向后移1位
1比5小,5向后移1位
1比4小,4向后移1位
1比3小,3向后移1位
到头了,把1赋给第一个数字
下标向后移
2比7小,7向后移1位
2比5小,5向后移1位
2比4小,4向后移1位
2比3小,3向后移1位
2比1大,2就放在原来3的位置上
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]