什么是插入算法?这个具体跟选择排序有点类似,但是有又一些差别。每一次插入,都要为插入的元素腾出空间,所以我们需要将其余所有元素在插入之前都要向右移动一位。与选择排序一样,当前索引左边的所有元素都是有序的,但是最终位置还不确定。为了给更小的元素腾出空间,它们都有可能被移动,但是索引到数组右端时,数组的排序就完成了。如果还听不懂,可以闭着眼想一想你们在玩斗地主或者打麻将的时候是怎么样排序的。
具体实现从简单的代码说起:
public class InsertSortMain {
public static void main(String[] args) {
String[] a = {"S","O","R","T","E","X","A","M","P","L","E"}; //定义一个数组
for(int i = 1 ;i<a.length;i++) {
for(int j = i;j>0;j--) { //此刻有个注意点,为什么是j--?
if(a[j].compareTo(a[j-1])< 0) {
String temp = a[j-1];
a[j-1]=a[j];
a[j]=temp;
}
}
System.out.print("第"+ i +"次排序:");
for(int k = 0;k < a.length;k++) {
System.out.print(a[k]+" ");
}
System.out.println();
}
}
}
输出结果:
插入排序和选择排序相比,如果数据比较多,但是已经有些元素已经是有序的排列的,所占用时间会比较少。
另外一种用函数的设计:
public class InsertSort {
public static void main(String[] args) {
String[] a = {"S","O","R","T","E","X","A","M","P","L","E"};
InsertSort(a);
show(a);
}
public static void InsertSort(Comparable[] a) {
int N = a.length; //获取数组的长度
for(int i =1; i<N;i++) {
for(int j = i;j > 0 && less(a[j],a[j-1]);j--) {
exch(a,j,j-1);
}
}
}
/**
* less()方法对元素进行比较
* @param v
* @param w
* @return
*/
private static boolean less(Comparable v,Comparable w) {
return v.compareTo(w) < 0;
}
/**
* 该方法将元素交换位置
* @param a
* @param i
* @param j
*/
private static void exch(Comparable[] a,int i ,int j) {
Comparable t =a[i];
a[i] = a[j];
a[j] = t;
}
/**
* 遍历函数
* @param a
*/
private static void show(Comparable[] a) {
for(int i = 0;i<a.length;i++) {
System.out.print(a[i]+" ");
}
System.out.println();
}
}
本教程参考图书:算法(第四版)