折半插入排序

来源:互联网 发布:阿里云在阿里巴巴 编辑:程序博客网 时间:2024/06/08 02:41

思想

直接插入排序其插入位置是在部分排序数组的后面开始判断找到插入位置,而折半插入排序是利用二分查找的方式找到插入位置

算法

package alg.sort;public class BinInsertSort {    public void sort(int[] A){        int n = A.length;        for(int i=1;i<n;i++){            int left = 0;            int right = i-1;            int x = A[i];            int id = binaryId(A,left,right,x);// 二分查找找到对应的插入位置            for(int j=right;j>=id;j--){ // 移动元素                A[j+1] = A[j];            }            A[id] = x;        }    }    // 二分查找找到对应的插入位置    public int binaryId(int[] A,int left,int right,int x){        if(left>=right)            return left;        while(left<= right){            int mid = left + (right - left)/2;            if(A[mid]==x)                return mid;            else if(A[mid]<x)                left = mid + 1;            else                 right = mid - 1;        }        return left;    }    public static void main(String[] args){        int[] A = new int[]{49,38,65,97,76,13,27,49};        PrintArray.printArray(A);        BinInsertSort binInsertSort = new BinInsertSort();        binInsertSort.sort(A);        PrintArray.printArray(A);    }}   

复杂度分析

(1)时间复杂度
对于折半查找时间复杂度O(log2n)
移动元素时间复杂度O(n)
最好情况:不需要移动元素,但是查找的时间还是O(log2n),时间复杂度O(nlog2n)
最坏情况:需要移动元素,时间复杂度O(n2)
平均时间复杂度O(n2)
(2)空间复杂度
只用到常量的变量,空间复杂度O(1)

0 0
原创粉丝点击