插入排序不是通过交换元素位置而是通过移动和插入元素来达到排序目的的。就像打牌的时候,我们抽到的牌是不连续的,于是我们要进行把牌较小的牌查到左边或者右边,大牌则往后移动位置。举个例子,9 2 5 8这个数组,从左边开始,9这个位置无需移动,从2开始,2比9小,于是把2抽出来,插入到9前面,9则移动到2原来的位置,以此类推。
import java.util.Comparator;
public interface Sorter {
/**
* 通过自身实现 Comparable接口进行比较排序
* @see Comparable
* @param list
*/
<T extends Comparable<T>> void sort(T[] list);
/**
* 通过补救性排序器Comparator 进行排序
* @see Comparator
* @param list
* @param cmpt
*/
<T> void sort(T[] list, Comparator<T> cmpt);
}
import java.util.Comparator;
/**
* 插入排序
* @author PYY
*
*/
public class InsertSorter implements Sorter {
@Override
public <T extends Comparable<T>> void sort(T[] list) {
if(list == null || list.length == 0)
return;
for(int i = 1; i < list.length; i++) {
int j = i;
T temp = list[i];
boolean inserted = false;
while(j > 0 && temp.compareTo(list[j - 1]) < 0) {
list[j] = list[j - 1];
--j;
if(!inserted)
inserted = true;
}
//插入
if(inserted)
list[j] = temp;
}
}
@Override
public <T> void sort(T[] list, Comparator<T> cmpt) {
if(list == null || list.length == 0)
return;
for(int i = 1; i < list.length; i++) {
int j = i;
T temp = list[i];
boolean inserted = false;
while(j > 0 && cmpt.compare(temp, list[j - 1]) < 0) {
list[j] = list[j - 1];
--j;
if(!inserted)
inserted = true;
}
//插入
if(inserted)
list[j] = temp;
}
}
}