排序算法---二分插入排序

二分(折半)插入(Binary insert sort)排序基本思想:设在数据表中有一个元素序列v[0],v[1],v[2]……v[n].其中v[0],v[1],v[2]……v[i-1]是已经排好序的元素。在插入v[i]。利用折半搜索寻找v[i]的插入位置。

二分插入排序是一种稳定的排序。当n较大时,总排序码比较次数比直接插入排序的最差情况好得多,但比最好情况要差,所元素初始序列已经按排序码接近有序时,直接插入排序比二分插入排序比较次数少。二分插入排序元素移动次数与直接插入排序相同,依赖于元素初始序列。

时间复杂度是:最好是O(n*log n),最坏是O(n2)。

java代码:

package test;

public class halfInsertSort {

    static void halfinsertSort(int[] a) {

        int i,j,tmp,left,middle,right;
        for(i=1;i<a.length;i++){
            left=0;
            tmp=a[i];
            right=i-1;
            // 二分法查找插入位置
            while(left<=right){
                middle=(left+right)/2;
                if(a[middle]>tmp)
                    right=middle-1;
                else {
                    left=middle+1;
                }
            }
            //每次查找完毕后,left总比right大1,a[left]总是存放第一个比tmp大的数,因此应从此处开始,每 个元素右移一位,并将tmp存入a[left]中,这样就保证了a[0...i]是排好序的
            for(j = i - 1; j>=left; j--){
                a[j+1]=a[j];
            }
            //插入
            a[left]=tmp;
        }
    }

    public static void main(String[] args) {
        int[] b = { 1, 3, 4, 5, 2, 3, 1 };
        halfinsertSort(b);
        for (int i = 0; i < b.length; i++) {
            System.out.print(b[i] + "\t");
        }
    }
}

你可能感兴趣的:(插入排序,排序算法)