• 折半插入排序算法


    原理
    折半插入排序(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
  • 相关阅读:
    unity学习(46)——服务器三次注册限制以及数据库化角色信息1--数据流程
    redis修改配置文件配置密码开启远程访问后台运行
    小景的Dba之路--impdp导入数据问题报错排查总结
    CF525E Anya and Cubes
    vue中 process.env 对象为空对象问题
    AWS入列CNCF基金会
    加速CI构建,实现高效流水线——CloudBees CI发布工作区缓存功能
    Springboot之请求参数接收方式详解
    从零开始学习线性回归:理论、实践与PyTorch实现
    Java 读取 xml 文件的五种方式
  • 原文地址:https://blog.csdn.net/m0_38068812/article/details/133615816