算法是很重要的东西, 总结一下供以后参考!
通用抽象类
public abstract class Sorter<E extends Comparable<E>> { public abstract void sort(E[] array,int from ,int len); public final void sort(E[] array) { sort(array,0,array.length); } protected final void swap(E[] array,int from ,int to) { E tmp=array[from]; array[from]=array[to]; array[to]=tmp; } }
一 插入排序法:
说明: 每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。
public class InsertSorter<E extends Comparable<E>> extends Sorter<E> { /** * from 起始位置 * len 从起始位置开始 需要比较的次数 */ public void sort(E[] array, int from, int len) { E tmp=null; for(int i=from+1;i<from+len;i++){ tmp=array[i]; int j=i; for(;j>from;j--){ if(tmp.compareTo(array[j-1])<0){ array[j]=array[j-1]; } else break; } array[j]=tmp; } } }
二 冒泡排序法:
说明: 算法思想是每次从数组末端开始比较相邻两元素,把第i小的冒泡到数组的第i个位置。i从0一直到N-1从而完成排序。(当然也可以从数组开始端开始比较相邻两元素,把第i大的冒泡到数组的第N-i个位置。i从0一直到N-1从而完成排序。)
public class BubbleSorter<E extends Comparable<E>> extends Sorter<E> { private static boolean DWON=true; public final void bubble_down(E[] array, int from, int len) { for(int i=from;i<from+len;i++) { for(int j=from+len-1;j>i;j--) { if(array[j].compareTo(array[j-1])<0) { swap(array,j-1,j); } } } } public final void bubble_up(E[] array, int from, int len) { for(int i=from+len-1;i>=from;i--) { for(int j=from;j<i;j++) { if(array[j].compareTo(array[j+1])>0) { swap(array,j,j+1); } } } } @Override public void sort(E[] array, int from, int len) { if(DWON) { bubble_down(array,from,len); } else { bubble_up(array,from,len); } } }
三 选择排序法:
说明: 选择排序相对于冒泡来说,它不是每次发现逆序都交换,而是在找到全局第i小的时候记下该元素位置,最后跟第i个元素交换,从而保证数组最终的有序。相对与插入排序来说,选择排序每次选出的都是全局第i小的,不会调整前i个元素了。
public class SelectSorter<E extends Comparable<E>> extends Sorter<E> { @Override public void sort(E[] array, int from, int len) { for(int i=0;i<len;i++){ int smallest=i; int j=i+from; for(;j<from+len;j++){ if(array[j].compareTo(array[smallest])<0) smallest=j; } swap(array,i,smallest); } } }