排序算法4:二分插入排序

数据结构与算法

1 基本思路

  • 二分插入排序,改进插入直接插入排序
  • 在新元素插入到已序数组时,用二分法查找插入的位置

2 算法复杂度分析

最坏 最好 稳定性 空间复杂度
O(n^2) O(nlog2n) 稳定 O(1)
  • 最好情况:每次插入的位置k都是已序数组的最后的位置,则无需再执行移位赋值操作 O(n*log2n)
  • 最坏情况:每次插入的位置k都是已序数组的最前的位置,则整个已序数组需要移位赋值 O(n^2)
  • 二分查找时间复杂度 O(log2n)

3 代码实现


/**
 * 二分插入排序,改进插入直接插入排序 
 * 在新元素插入到已序数组时,用二分法查找插入的位置 
 * 最好情况:每次插入的位置k都是已序数组的最后的位置,则无需再执行移位赋值操作 O(n*log2n) 
 * 最坏情况:每次插入的位置k都是已序数组的最前的位置,则整个已序数组需要移位赋值 O(n^2) 
 * 空间复杂度 O(1) * 稳定性 稳定 
 * 二分查找时间复杂度 O(log2n) 
 */
public class BinaryInsertion {
    public static void main(String[] args) {
        int[] a = new int[10];
        //random array        
        for (int i = 0; i < a.length; i++) {
            Random rd = new Random();
            a[i] = rd.nextInt(10);
        }
        System.out.println("Random Array :");
        System.out.println(Arrays.toString(a));
        System.out.println();
        System.out.println("Binary Insertion Sort :");
        //插入排序        
        // 外循环规定从第二个元素开始,将元素插入到已排好的数组中        
        for (int i = 1; i < a.length; i++) {
            //得到插入的位置            
            int k = findByBinary(a, i);
            //保存a[i]            
            int key = a[i];
            //元素后移           
            for (int j = i - 1; j >= k; j--) {
                a[j + 1] = a[j];
            }
            a[k] = key;
        }
        System.out.println(Arrays.toString(a));
    }

    public static int findByBinary(int[] a, int i) {
        int highIndex = i - 1;
        int lowIndex = 0;
        int mid = -1;
        while (lowIndex <= highIndex) {
            mid = (highIndex + lowIndex) / 2;
            if (a[i] >= a[mid]) {
                //若相等,保证新元素插在旧元素后面                
                lowIndex = mid + 1;
            } else {
                highIndex = mid - 1;
            }
        }
        return lowIndex;
    }
}

参考

排序算法:二分插入排序

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 该系列文章主要是记录下自己暑假这段时间的学习笔记,暑期也在实习,抽空学了很多,每个方面的知识我都会另起一篇博客去记...
    Yanci516阅读 14,231评论 6 19
  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 11,402评论 0 13
  • 电 影 跟 爆 米 花 烤 串 儿 跟 冰 啤 酒 泡 面 跟 火 腿 肠 饺 子 跟 醋 我 跟 你 不想养猫 ...
    叁石易阅读 5,145评论 0 1
  • 函数(高中数学)
    V思数学阅读 1,153评论 0 0
  • 有风,却不冷 飘来飘去的思念 在漫漫长河游荡了千年 今夜终于可以回味 风中有雨,却不湿 洒了无数不眠之夜的泪水 汇...
    诗路阅读 44评论 0 0

友情链接更多精彩内容