码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 折半插入排序算法


    原理
    折半插入排序(Binary Insertion Sort)是对插入排序算法的一种改进。不断的依次将元素插入前面已排好序的序列中。由于前半部分为已排好序的数列,这样我们不用按顺序依次寻找插入点,可以采用折半查找的方法来加快寻找插入点的速度。
    代码实现
    在将一个新元素插入已排好序的数组的过程中,寻找插入点时,将待插入区域的首元素设置为 a[low] ,末元素设置为 a[high] ,则每轮比较时将待插入元素与 a[m] ,其中 m = (low+high)/2 相比较,如果比参考元素小,则选择a[low]到a[m-1]为新的插入区域(即high=m-1),否则选择 a[m+1] 到 a[high] 为新的插入区域(即low=m+1),如此直至low<=high 不成立,即将此位置之后所有元素后移一位,并将新元素插入a[high+1]。
    总之:利用已排好的元素有序的特点,使用折半查找的特点来快速找到要插入的位置。

     /**
         * 折半插入排序算法的实现
         * @param a
         */
        private void binaryInsertSort(int[] a) {
            System.out.println("———————————————————折半插入排序算法—————————————————————");
            int n = a.length;
            int i,j;
            for(i=1;i<n;i++){
                /**
                 * temp为本次循环待插入有序列表中的数
                 */
                int temp = a[i];
                int low=0;
                int high=i-1;
                /**
                 * 寻找temp插入有序列表的正确位置,使用二分查找法
                 */
                while(low <= high){
                    /**
                     * 有序数组的中间坐标,此时用于二分查找,减少查找次数
                     */
                    int mid = (low+high)/2;
                    /**
                     * 若有序数组的中间元素大于待排序元素,则有序序列向中间元素之前搜索,否则向后搜索
                     */
                    if(a[mid]>temp){
                        high = mid-1;
                    }else{
                        low = mid+1;
                    }
                }
                
                for(j=i-1;j>=low;j--){
                    /**
                     * 元素后移,为插入temp做准备
                     */
                    a[j+1] = a[j];
                }
                /**
                 * 插入temp
                 */
                a[low] = temp;
                /**
                 * 打印每次循环的结果
                 */
                print(a,n,i);
            }
            /**
             * 打印排序结果
             */
            printResult(a,n);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
  • 相关阅读:
    华为与开放原子开源基金会携四大开源产品亮相1024程序员节
    mPEG-DSPE 178744-28-0 甲氧基-聚乙二醇-磷脂酰乙醇胺线性PEG磷脂
    ACWing第十三次课第7讲 类、结构体、指针、引用3. 链表斐波那契数列,替换空格,求1+2+…+n,在O(1)时间删除链表结点,合并两个排序的链表
    Gavin Wood 演讲全文:建设更具韧性以应变化的 Polkadot
    SpiderPool - 云原生容器网络 IPAM 插件
    【技术积累】Python中的NumPy库【一】
    Csa文件创建,删除的方法,
    Opencv与python实现多目标跟踪 (二)- 目标跟踪
    梦开始的地方——C语言指针练习题
    功能解剖学重点
  • 原文地址:https://blog.csdn.net/m0_38068812/article/details/133615816
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号