①直接插入排序
一.思路
每次循环都值对数组的一部分进行排序。算法从第二个位置开始,它总是假设在它之前的所有元素都是已经排好序的一群元素,在最开始,它只有一个元素,就是第一个元素。 后面的所有元素都依次往这个已经排好序的一群元素中插,使它还是一群排好序的元素。
元素插入的过程:既然前面是已经排好序的了,所以这个插入的元素只需要保存它的值,用这个值从最大的开始比较,如果最大数比它大,则把最大数往后移一位,接着按照减小的顺序依次比较,如果比它大,则后移一位,直到遇见比它小的。
二.伪代码
insertsort(a[])
for i=1 to data.length-1
tmp=a[i];
将所有大于tmp的元素a[j]往后移一位;
将tmp的值放在正确的位置;
三.java实现
/**
* @author garypotter
* @version 创建时间:2016年4月2日 下午1:54:32
* @TODO
* 类说明
*/
public class InsertSort {
public static void main(String[] args) {
Object[] a={5,2,3,8,1};
insertsort(a);
System.out.println("result:"+a[0]+a[1]+a[2]+a[3]+a[4]);
}
public static void insertsort(Object[] a){
for(int i=1,j;i<a.length;i++){ //注意,j定义在这里,因为还需要内部的j来找到插入的位置,现在已经有i个已经排好
Comparable tmp=(Comparable)a[i];
for(j=i;j>0&&tmp.compareTo(a[j-1])<0;j--){ //现在已经有i个排列好的,从i-1,就是最后一个排列好的值,开始一个个比较,
//与tmp值比较,大者后移一位,遇见小的表示找到插入位置,插入,
a[j]=a[j-1]; //a[j-1]的值比tmp大,则将a[j-1]的值后移一位,放到a[j]中去
}
a[j]=tmp; //j-1比tmp小,说明j就是该插入的位置,找到插入的位置了,把值放进去
}
}
public static void swap(Object[] a,int m,int n){
Object temp=a[m];
a[m]=a[n];
a[n]=temp;
}
}
四.分析
观察外部循环,总是迭代n-1次。
最好情况:已经有序,比较一次就确定位置,总共需要比较(n-1)次,移动2(n-1)次。
最坏情况:反序。对于第i次外部循环,内部都需要比较i次,所以总比较次数为1+2+.....+n=n(n-1)/2次。此时,移动次数是n(n-1)/2,再加上外部for循环载入和卸载tmp的次数,即2(n-1),即此时总共移动n(n-1)/2+2(n-1)次。
比较次数依赖于它距离正确位置有多远。