被排序的元素: package org.pbdevj.ds.sort.insert; /**被排序的元素*/ public class Element implements Comparable<Element> { private Object eValue; public void seteValue(Object eValue) { this.eValue = eValue; } public Object geteValue() { return eValue; } public Element() { // TODO Auto-generated constructor stub } public Element(Object eValue) { // TODO Auto-generated constructor stub this.eValue = eValue; } @Override public String toString() { // TODO Auto-generated method stub return eValue==null?"":eValue.toString(); } @Override public int compareTo(Element o) { // TODO Auto-generated method stub return this.toString().compareTo(o.toString()); } } 排序回调接口: package org.pbdevj.ds.sort.insert; public interface ISortCallBack { /** * e:当前参与排列的数 * count:当前总计比较次数 * */ public void visit(Object e); } 排序接口: package org.pbdevj.ds.sort.insert; import java.io.Serializable; /*排序接口*/ public interface ISort extends Serializable{ public void sort(); public void sort(ISortCallBack sortCallBack); public void output(); } 插入排序实现: package org.pbdevj.ds.sort.insert; import java.io.Serializable; @SuppressWarnings("undefined") /**插入排序*/ public class InsertSort implements ISort { private Element[] elements; public InsertSort() { // TODO Auto-generated constructor stub } public InsertSort(Element[] elements) { // TODO Auto-generated constructor stub this.elements = elements; } @Override public void sort() { // TODO Auto-generated method stub if (elements==null || elements.length==0 || elements.length==1) return; //2 9 5 3 2 1 10 for (int i = 1; i < elements.length; i++) {//外循环逐个数和内循环[前面已经排好序的数]的逐个数从前往后比较 // //算法一:将当前元素和前面已排好的元素从低位到高位逐个比较 // for (int j = 0; j < i; j++) {//从头开始比较到当前元素位置为止[比如上面的5从2开始比较到9为止] // if (elements[i].compareTo(elements[j])==0 || // elements[i].compareTo(elements[j])<0){//相等或小于前面的某个数则插入 // insertItem(elements,j,i);//找到需要插入的数后单独调用这个函数[这个函数内部的再次循环增大了开销]进行移位操作 // break; // } // } //算法二:将当前元素和前面已排好的元素从高位到低位逐个比较 int temp = i;//记录当前元素位置 Element currentElement = elements[i];//记录下当前元素 //当前索引没有达到数组头[0下标]并且前一个元素比当前元素小的时候则前一个元素后移一位 while(temp>0 && currentElement.compareTo(elements[temp-1])<0){ elements[temp] = elements[temp-1];//前一个元素后移一位 temp--;//索引前移一位 //进入第二次循环再比较前移一位后的索引与前前一位的索引是否满足移动要求 } elements[temp] = currentElement;//交换 } } /** * * 将indexSrc元素插入到elements中的indexTarget位置,indexTarget位置之后的数向后移一位 * indexSrc应该大于indexTarget * */ private void insertItem(Element[] elements,int indexTarget,int indexSrc){ if (elements==null || elements.length<=1 || indexTarget<0 || indexTarget>elements.length || indexSrc<0 || indexSrc>elements.length){ return; } Element e = elements[indexSrc];//记录下带插入的元素 for (int i = indexSrc; i > indexTarget; i--) {//插入位置后的元素依次后移 elements[i] = elements[i-1]; } elements[indexTarget] = e;//插入这个元素 } @Override public void sort(ISortCallBack sortCallBack) { // TODO Auto-generated method stub if (elements==null || elements.length==0 || elements.length==1) return; //2 9 5 3 2 1 10 for (int i = 1; i < elements.length; i++) {//外循环逐个数和内循环[前面已经排好序的数]的逐个数从前往后比较 if (sortCallBack!=null) sortCallBack.visit(elements[i]); // //算法一:将当前元素和前面已排好的元素从低位到高位逐个比较 // for (int j = 0; j < i; j++) {//从头开始比较到当前元素位置为止[比如上面的5从2开始比较到9为止] // if (elements[i].compareTo(elements[j])==0 || // elements[i].compareTo(elements[j])<0){//相等或小于前面的某个数则插入 // insertItem(elements,j,i);//找到需要插入的数后单独调用这个函数[这个函数内部的再次循环增大了开销]进行移位操作 // break; // } // } //算法二:将当前元素和前面已排好的元素从高位到低位逐个比较 int temp = i;//记录当前元素位置 Element currentElement = elements[i];//记录下当前元素 //当前索引没有达到数组头[0下标]并且前一个元素比当前元素小的时候则前一个元素后移一位 while(temp>0 && currentElement.compareTo(elements[temp-1])<0){ elements[temp] = elements[temp-1];//前一个元素后移一位 temp--;//索引前移一位 //进入第二次循环再比较前移一位后的索引与前前一位的索引是否满足移动要求 } elements[temp] = currentElement;//交换 } } @Override public void output() { // TODO Auto-generated method stub if (elements!=null){ for (Element e : elements) { System.out.println(e); } } } } 测试: package org.pbdevj.ds.sort.insert.utest; import org.pbdevj.ds.sort.insert.Element; import org.pbdevj.ds.sort.insert.ISort; import org.pbdevj.ds.sort.insert.ISortCallBack; import org.pbdevj.ds.sort.insert.InsertSort; public class InsertSortTest { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Element[] elements=new Element[]{ new Element(90), new Element(80), new Element(70), new Element(60), new Element(50), new Element(40), new Element(90), new Element(10) }; ISort sort = new InsertSort(elements); System.out.println("before sort...."); sort.output(); System.out.println("start sort....."); sort.sort(new ISortCallBack() { @Override public void visit(Object e) { // TODO Auto-generated method stub System.out.println(e); } }); System.out.println("after sort..."); sort.output(); } }