插入排序之:折半插入排序

什么是折半插入排序?

因为直接插入排序在数据集完全无序(要求升序,数据集却是降序),对待插入数据插入位置的查找时间复杂度太高。
所以我们引出折半插入排序,它在针对无序的数据集时,效果更好。

核心思想-二分查找

寻找插入位置时,从已排序区间的中间值开始比较

low-已排序区间的第一个值
high-已排序区间的最后一个值
mid-已排序区间的中间值
i待排序的第一个值

循环条件:high>low 终止条件:high>low i插入high的下一个位置

下标01234567
数据15798243
初始lmhi
i>m h>ll/mh
i<m h=lh/l/m
h=h-1 i=h+1hl

优缺点

折半插入排序在无序集情况下优于直接排序。但在近似有序集下,优于折半插入排序比较次数较多。因此最好情况下的直接插入排序要优于折半插入排序

复杂度和稳定性都与直接插入排序相同

实现代码

   public static void shellSort(int[] array) {
       int n = array.length;
       if (n <= 1) {
           return;
       } else {
           int step = n / 2;
           while (step >= 1) {
               for (int i = 1; i < n; i++) {
                   int temp = array[i];
                   int j = i - step;
                   for (; j >= 0; j-=step) {
                       if (temp < array[j]) {
                           array[j + step] = array[j];
                       } else {
                           break;
                       }
                   }
                   array[j + step] = temp;
               }
               step /=2;
           }
       }
   }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值