插入排序--折半插入排序

插入排序的基本思想:每步将一个待排序元素,按其排序码大小插入到前面已经排好序的一组元素中,直到元素全部插入为止。在这里,我们介绍三种具体的插入排序算法:直接插入排序,希尔排序与折半插入排序。


折半插入排序的思想:当插入第i(i>=1)个元素时,前面的V[0],…,V[i-1]等i-1个 元素已经有序。这时,折半搜索第i个元素在前i-1个元素V[i-1],…,V[0]中的插入位置,然后直接将V[i]插入,同时原来位置上的元素向后顺移。与直接插入排序不同的是,折半插入排序比直接插入排序明显减少了关键字之间的比较次数,但是移动次数是没有改变。所以,折半插入排序和插入排序的时间复杂度相同都是O(N^2),但其减少了比较次数,所以该算法仍然比直接插入排序好。折半插入排序是一种稳定的排序算法,其实现如下:

package keking.sort;

import java.util.Arrays;

/**
 * Title: 折半插入排序
 * Description: 折半搜索出插入位置,并直接插入;与直接插入搜索的区别是,后者的搜索要快于顺序搜索
 *              时间复杂度:折半插入排序比直接插入排序明显减少了关键字之间的比较次数,但是移动次数是没有改变。所以,
 *              折半插入排序和插入排序的时间复杂度相同都是O(N^2),在减少了比较次数方面它确实相当优秀,所以该算法仍然比直接插入排序好。
 *              空间复杂度:O(1)
 *              稳    定   性:稳定
 *              内部排序(在排序过程中数据元素完全在内存)
 * @author keking
 *
 */
public class BinaryInsertSort {

    public static int[] binaryInsertSort(int[] target){
        if(target != null && target.length > 1){
            for(int i = 1; i < target.length; i++){
                int left = 0;
                int right = i - 1;
                int mid;
                int temp = target[i];
                if(temp < target[right]){
                    while(left <= right){
                        mid = (left + right) / 2;
                        if(temp < target[mid]){
                            right = mid - 1;
                        }else if(temp > target[mid]){
                            left = mid + 1;
                        }else{
                            left = left + 1;
                        }
                    }
                    for(int j = i; j > left; j--){
                        target[j] = target[j-1];
                    }
                    target[left] = temp;
                }
            }
        }
        return target;
    }

    public static void main(String[] args) {
        int[] arr = {12,56,564,564,22,34,12,748,65,385,486,53,2,35,64,};
        System.out.println(Arrays.toString(arr));
        int[] arr1 = binaryInsertSort(arr);
        System.out.println(Arrays.toString(arr1));
    }
}

输出结果:

[12, 56, 564, 564, 22, 34, 12, 748, 65, 385, 486, 53, 2, 35, 64]
[2, 12, 12, 22, 34, 35, 53, 56, 64, 65, 385, 486, 564, 564, 748]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值