插入排序
有N个元素,假设前面K个元素已经排好序,对第K+1个元素,需要插入到前面的K个元素中,保证前K+1个元素是有序的,依次类推,直到余下元素全部插入完成。
举个例子
有一个数组: 3 2 6 8 1
第一轮:current=2,插入完顺序为: 2 3 6 8 1
第二轮:current=6,插入完顺序为: 2 3 6 8 1
第三轮:current=8,插入完顺序为: 2 3 6 8 1
第四轮:current=1,插入完顺序为: 1 2 3 6 8
代码实现
public class InsertionSort {
/**
* 插入排序:有N个元素,假设前面K个元素已经排好序,对剩下的N-K个元素,需要插入到前面的K个元素中,
* 保证前K+1个元素是有序的
*/
public static int[] insertionSort(int[] arr) {
int len = arr.length;
//从1开始是因为1个元素永远是有序的
for (int i = 1; i < len; i++) {
//将当前元素存起来
int current = arr[i];
//从当前元素的前一个开始元素开始比较并移动
int j = i - 1;
while (j >= 0 && arr[j] > current) {
arr[j + 1] = arr[j];
j--;
}
//由于前面j--导致此处应该用j+1
arr[j + 1] = current;
}
return arr;
}
public static void main(String[] args) {
Random r = new Random();
int[] arr = new int[20];
for (int i = 0; i < arr.length; i++) {
arr[i] = r.nextInt(100);
}
//未排序
System.out.printf("排序前:%s \n", Arrays.stream(arr).boxed().map(Object::toString).collect(Collectors.joining(" ")));
//排好序
System.out.printf("排序后:%s \n", Arrays.stream(insertionSort(arr)).boxed().map(Object::toString).collect(Collectors.joining(" ")));
}
}
运行结果
排序前:78 27 87 55 78 92 56 15 77 98 99 42 89 6 59 6 61 8 75 20
排序前:6 6 8 15 20 27 42 55 56 59 61 75 77 78 78 87 89 92 98 99