直接插入算法
顾名思义,就是在有序数组中适当的位置插入元素。
算法思路:把待排序的数组,第0位的元素看做是一个排好序的数组,之后用temp记录数组的第1位,与前面的元素依次进行比较,如果小于前面的元素,那么就将前面的元素赋值给后边的元素,直到temp小于前面的某一个元素位置,将temp赋值给该位置。之后重复操作,将所有元素插入到适合的位置。
图解
这是一个待排序的数组。
待排序数组.png
发现23比28小,需要将23插入到前面适当的地方。
待排序.png
用temp记下23这个值,避免了交换元素浪费时间,这样直接赋值就好。将28赋值到23的位置。之后蓝色标志位向前移动,比较26与temp的大小。
待排序.png
结果发现26也大于23,将26向后一位赋值。蓝色标前移。
待排序.png比较发现20小于23,所以temp就应该插在20的后面。
完成.png
之后红色标识后移一位,蓝色标志移动到红色前一位,temp = 28,重复操作。
下一轮.png
完整代码如下:
/**
* Created by ShouJingGuo on 2018/3/14.
* 直接插入排序
*/
public class InsertSort {
public static <T> void insertSort(T[] arr, Comparator<T> comparator){
for(int i = 1; i < arr.length; i++){
T temp = arr[i];
int j = i - 1;
while((j >= 0) && (comparator.compare(arr[j], temp) > 0)){
arr[j+1] = arr[j];
j--;
}
arr[j+1] = temp;
}
}
public static void main(String[] args) {
Integer arr[] = {10,50,24,11,68,20,41,0,24,25,4,7,94,15,5,44,66};
InsertSort.insertSort(arr, new IntegerComparator());
System.out.println(Arrays.toString(arr));
}
}
网友评论