插入排序
基本思路:
基本操作是将一个记录插入到已排好序的有序表中,从而得到一个新的、记录数增1的有序表。
问题描述:
举个例子来说,就用前面的数组,我们要对一个有5个元素的数组进行升序排列,假设
第一个元素的值被假定为已排好序了,那么我们就将第2 个元素与数组中的部分进行比较,
如果第2 个元素的值较小,则将它插入到第1 个元素的前面,现在就有两个元素排好序了,
我们再将没有排序的元素与排好序的元素列表进行比较,同样,如果小于第一个元素,就将
它插入到第一个元素前面,但是,如果大于第一个元素的话,我们就将它再与第2 个元素的
值进行比较,小于的话就排在第2 个元素前面,大于的话,就排在第2 个元素的后面。以此
类推,直到最后一个元素排好序。
点评:
该算法在数据规模小的时候十分高效,该算法每次插入第K+1到前K个有序数组中
一个合适位置,K从0开始到N-1,从而完成排序
基本操作是将一个记录插入到已排好序的有序表中,从而得到一个新的、记录数增1的有序表。排序过程:
public class InsertSorter<T extends Comparable<T>> extends Sorter<T> { /** * 插入排序 */ @Override public void sort(T[] array, int from, int len) { T 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;//保存被替换的的值,进入下一个循环 } } /** * 测试 * @param args */ public static void main(String[] args) { Integer array[] = {2,35,5,78,1,90,13,56} ; for (int i = 0 ; i<array.length ; i++){ System.out.print(array[i]+","); } System.out.println(); Sorter sorter = new InsertSorter<Integer>() ; sorter.sort(array) ; for (int i = 0 ; i<array.length ; i++){ System.out.print(array[i]+","); } } }
2、折半插入排序
在直接插入排序中,为了找到插入位置,采用了顺序查找的方法。为了提高查找速度,可以采用折半查找,这种排序称折半插入排序。
3、2-路插入排序
为减少排序过程中移动记录的次数,在折半插入排序的基础上加以改进: