插入排序算法
通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应的位置并插入。 插入排序非常类似于整扑克牌。在开始摸牌时,左手是空的,牌面朝下放在桌上。接着,一次从 桌上摸起一张牌,并将它插入到左手一把牌中的正确位置上。为了找到这张牌的正确位置,要将 它与手中已有的牌从右到左地进行比较。无论什么时候,左手中的牌都是排好序的。
如果输入数组已经是排好序的话,插入排序出现最佳情况,其运行时间是输入规模的一个线性函 数。如果输入数组是逆序排列的,将出现最坏情况。平均情况与最坏情况一样,其时间代价是(n2
java 实现
public class InsertSort {
private int[] sourceArr;
private int index = 0;
public static void main(String[] args) {
InsertSort insertSort = new InsertSort();
int[] arr = new int[] { 86, 50, 23, 45, 32, 79, 2, 4, 1, 9, 5, 34, 12, 43, 11, 23, 11, 13, 10 };
insertSort.sort(arr);
System.out.println(Arrays.toString(arr));
arr = new int[] { 86, 50, 23, 45, 32, 79, 2, 4, 1, 9, 5, 34, 12, 43, 11, 23, 11, 13, 10 };
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
}
public void sort(int[] arr) {
this.sourceArr = arr;
this.index = 1;
int i = 1;
for (; i < this.sourceArr.length; i++) {
int vi = this.sourceArr[i];
// 从 sourceArr 的尾部开始比较
int j = this.index - 1;
sortd(vi, j);
this.index++;
}
}
private void sortd(int vi, int j) {
if (j >= 0) {
int vj = this.sourceArr[j];
// 比较找到适合的插入位置
// this.targetArr[j-] < vi < this.targetArr[j]
//
int c = comp(vi, vj);
if (c == 1) {
// 交换位置,
this.sourceArr[j + 1] = vj;
this.sourceArr[j] = vi;
// 递归比较
sortd(vi, j - 1);
return;
} else {
// 当 c == 0, 或者 c == -1 直接插入 j + 1 的位置
this.sourceArr[j + 1] = vi;
return;
}
}
}
private int comp(int vi, int vj) {
if (vi == vj) {
return 0;
} else if (vi > vj) {
return 1;
} else {
return -1;
}
}
}