折半插入排序

本文详细介绍了折半插入排序的基本思想及其实现过程,通过利用折半查找来减少关键字的比较次数,提高了插入排序的效率。尽管折半插入排序的时间复杂度仍为O(n^2),但它在待排序元素较多的情况下能显著提升性能。

基本思想

    考虑到 L.r[1..i-1] 是按关键字有序的有序序列,则可以利用折半查找实现“ L.r[1…i-1]中查找 L.r[i] 的插入位置”如此实现的插入排序为折半插入排序。折半插入排序在寻找插入位置时,不是逐个比较而是利用折半查找的原理寻找插入位置。待排序元素越多,改进效果越明显。

 

package sort.insertionSort;  
  
public class BinaryInsertionSort {  
  
    /** 
     * @param args 
     */  
    //对顺序表L做折半插入排序,利用折半查找快速找到要插入的位置  
    public static void binaryInsertSort(int[] L){  
        for(int i = 2; i <= L.length-1; i++){          
            //利用折半查找找到要插入的位置  
            int low = 1, high = i-1;//在1->i-1的有序子序列中插入第i个元素,使之成为1->i的有序子序列  
            L[0] = L[i];//暂存要插入的元素  
            while(low <= high){  
                int mid = (low+high)/2;  
                if(L[0] < L[mid])  
                    high = mid -1;  
                else  
                    //L[0] >= L[mid]  
                    low = mid+1;//等于当成大于处理,这样后出现的相等值就会排在后面,从而到达“稳定”  
            }  
            //此时high = low-1,且high+1即low的位置即为要插入的位置  
            for(int j = i-1; j >= low; j--)  
                L[j+1] = L[j];  
            L[low] = L[0];  
        }  
    }  
    public static void main(String[] args) {  
        // TODO Auto-generated method stub  
        int[] test = {0, 53, 27, 36, 15, 69, 42}; //0号单元未使用  
        binaryInsertSort(test);  
        for(int i = 1; i <= test.length-1; i++)  
            System.out.print(test[i]+" ");  
    }  
}  

 

运行结果:

 

    折半插入排序减少了关键字的比较次数,但记录的移动次数不变,其时间复杂度与直接插入排序相同,时间复杂度为O(n^2) 。折半插入排序是“稳定的”。

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangvalue

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值