排序算法之折半插入排序

折半插入排序算法是对直接插入排序算法的简单改进,主要将折半比较的思想引入插入排序,在一定程度上提高了直接插入排序的效率。

算法描述

直接插入排序算法中,当第i-1趟需要将第i个元素插入到0~i-1个元素之间时,总是需要从第i-个元素开始,依次与前面的每一个元素进行比较,直至找到合适的位置进行插入。这样比较的过程显然没有利用到0~i-1个元素已经有序这一有效信息,折半插入排序则对此进行了改进。当需要将第i个元素插入到先前有序列表中去时,折半排序的做法是:

  1. 首先选取0~i-1个有序列表元素的中间元素,即位置为(i-1)/2的元素,与需要插入的第i个元素进行比较,如果位置为(i-1)/2处的元素大于第i个元素,则在位置区间为0~(i-1)/2-1的范围内进行搜索,反之则在(i-1)/2+1~i-1的范围内进行搜索。以上过程即是折半的思想;
  2. 在以上半个范围内进行搜索时,可以重复1中的搜索方法,这样即把搜索区间逐渐缩小为1/4,1/8等,从而较快的定位合适的插入位置。

算法分析

折半插入排序的时间复杂度:
折半插入排序算法相对直接插入排序算法减少了插入位置的寻找比较次数,但是没有减少元素的移动次数,所以排序的时间复杂度没有大的变化,基本和直接插入排序保持一致。

算法Java代码实现

import java.util.Arrays;  

public class BinaryInsertSort {  

    public static void binaryInsertSort(int[] data,int n){  

        for(int i=1; i<n; i++){  
            int tmp = data[i];     
            int low = 0;  
            int high = i-1;  

            // 不断折半,寻找合适的插入位置  
            while(low <= high){  
                int mid = (low + high) / 2;  

                if(tmp>data[mid]){  
                    low = mid + 1;  
                }else{  
                    high = mid - 1;  
                }  
            }  

            // 依次将元素后移  
            for(int j=i; j>low ; j--){  
                data[j] = data[j-1];  
            }  

            data[low] = tmp;    
        }  
    } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值