什么是插入排序
引自《算法导论》

排序移动的动态图片

处理逻辑

算法导论的伪代码

实现代码
代码引自《算法》
插入排序的实现
package algorithm.sort;
// 插入排序
public class InsertionSort extends AbstractSort {
@Override
public void sort(Comparable[] a) {
int len = a.length;
for (int i = 1; i < len; i++) {
//找到最小的值对应的索引
for (int j = i; j>0 && less(a[j],a[j-1]); j--) {
exch(a,j,j-1);
}
}
}
}
框架代码,瞅瞅就行
package algorithm.sort;
import java.util.Random;
// 基础类,其他子类继承这个类
public abstract class AbstractSort {
public static void main(String[] args) {
// AbstractSort sortService = new SelectionSort();
AbstractSort sortService = new InsertionSort();
DataInfo[] a = new DataInfo[20];
for (int i = 0; i < a.length; i++) {
a[i] = new DataInfo();
a[i].setNumber(new Random().nextInt(100));
}
sortService.show(a);
sortService.sort(a);
assert sortService.isSorted(a);
sortService.show(a);
}
public abstract void sort(Comparable[] a);
protected boolean less(Comparable a, Comparable b) {
return a.compareTo(b) < 0;
}
protected void exch(Comparable[] a, int i, int j) {
Comparable t = a[i];
a[i] = a[j];
a[j] = t;
}
protected void show(Comparable[] a) {
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
System.out.println();
}
// 看是否已经是有序的了
public boolean isSorted(Comparable[] a) {
for (int i = 1; i < a.length; i++) {
if (less(a[i], a[i - 1])) {
return false;
}
}
return true;
}
}
数据结构
package algorithm.sort;
public class DataInfo implements Comparable<DataInfo> {
private long number;
public long getNumber() {
return number;
}
public void setNumber(long number) {
this.number = number;
}
@Override
public int compareTo(DataInfo o) {
if (this.number > o.number) {
return 1;
}
if (this.number < o.number) {
return -1;
}
return 0;
}
@Override
public String toString() {
return "DataInfo{" +
"number=" + number +
'}';
}
}