排序之插入类排序

1。直接插入排序

package Sort; 
/** 
 * @author wangpei 
 * @version 
 *创建时间:2017年3月28日 下午7:30:37 
 * 插入排序中的直接插入排序
 * 思路:对于r[i],其r[1]-r[i-1]位为有序的,r[i]插入到该有序序列中,
 * 再依次向下,比较r[i+1]......
 */


//适用于序列基本有序的情况。最好情况比较n-1次,移动(n+2)*(n-1)/2
//最坏情况比较(n+2)*(n-1)/2,移动(n-1)*(n+4)/2
//平均:o(n*n)
public class Zhijiecharu {
    public static void main(String[] args) {
        int a[]={0,2,5,3,9,10,1};
        sort(a);
    }
    public static void sort(int a[] ){
        int j=0;
        for(int i=2;i<a.length;i++){
            a[0]=a[i];
            for(j=i-1;a[0]<a[j];j--){//将其插入前边的i-1位
                 a[j+1]=a[j];
            } 
            a[j+1]=a[0];
        }
        for(int i=1;i<a.length;i++){
            System.out.println(a[i]);
        }

    }

}

2。折半插入排序

package Sort; 
/** 
 * @author wangpei 
 * @version 
 *创建时间:2017年3月28日 下午7:58:43 
 * 折半插入
 * 思路: 先在第i-1个元素中折半查找出i要插入的位置,然后移位插入。
 */
//稳定排序,时间复杂度:o(n*n)
public class Zhebancharu {
    public static void main(String[] args) {
        int a[]={0,2,5,3,9,10,1};
        sort(a);
    }

    public static void sort(int a[] ){
        for (int i = 2; i < a.length; i++) {
            //先查找a[i]在前i-1个元素中要插入的位置
            int low=1;
            int high=i-1;
            a[0]=a[i];
            while(low<=high){
                int mid=(low+high)/2;
                if(a[mid]>a[0]) high=mid-1;
                else     low=mid+1;
            }//最终查找到i的插入位置为low
            for(int k=i-1;k>=low;k--){
                a[k+1]=a[k];
            }
            a[low]=a[0];

        }
        for (int i = 1; i < a.length; i++) {
            System.out.println(a[i]+",");

        }

    }

}
posted @ 2017-03-28 20:27  多巴胺二次元式  阅读(172)  评论(0编辑  收藏  举报