当前位置: 首页 > news >正文

折半插入排序

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

 只有比别人更早、更勤奋地努力,才能尝到成功的滋味。              ------麦克马斯特大学训言      

 http://bbs.itheima.com/thread-23776-1-1.html?fstgj

以前的学习网站,-全套java视频教程,需要的自己看下,可以去这个网站下载,下载视频免费,不需要注册和做什么任务

 

   记得之前总结过插入排序,有兴趣的可以看看---插入排序。

   如果在最复杂的情况下,所要排序的整个数列是逆序的,当第 i-1 趟需要将 第 个元素插入前面的 0~ i -1 个元素的序列当中的时候,它总是会从第 i -1 个元素开始,逐个比较每个元素的大小,直到找到相应的位置。

   这个算法中丝毫没有考虑当要插入第 个元素时前面的 0~~ i -1 序列是有序的这个特点。今天要总结的这个算法就充分的利用了这一点。

 

算法的基本过程:

   1)计算 0 ~ i-1 的中间点,用 索引处的元素与中间值进行比较,如果 索引处的元素大,说明要插入的这个元素应该在中间值和刚加入i索引之间,反之,就是在刚开始的位置 到中间值的位置,这样很简单的完成了折半;

   2)在相应的半个范围里面找插入的位置时,不断的用(1)步骤缩小范围,不停的折半,范围依次缩小为 1/2  1/4  1/8 .......快速的确定出第 i  个元素要插在什么地方;

   3)确定位置之后,将整个序列后移,并将元素插入到相应位置。

 

算法实现:

复制代码
import java.util.*; public class BinaryInsertSort { private static int[] Sort(int[] arr) { int i, j; //保存中间插入的值 int insertNote = 0; //将待排序的数列保存起来 int[] array = arr;
        System.out.println("开始排序:"); for (i = 1; i < array.length; i++) { int low = 0; int high = i - 1;
            insertNote = array[i]; //不断的折半 while (low <= high) { //找出中间值 int mid = (low + high) / 2; //如果大于中间值 if (array[i] > array[mid]) { //在大于中间值的那部分查找 low = mid+1;
                } else //在小于中间值的那部分查找 high = mid-1;
            } //将整体数组向后移 for ( j=i; j > low; j--) {
                array[j] = array[j - 1];
            } //插入到指定的位置 array[low] = insertNote;
            System.out.println(Arrays.toString(array));
        }
        System.out.println("排序之后:");
        System.out.println(Arrays.toString(array)); return array;
    } public static void main(String[] args) {
        Random random = new Random(); int[] array = new int[10]; for (int i = 0; i < 10; i++) {
            array[i] = Math.abs(random.nextInt() % 100);
        }
        System.out.println("排序之前:");
        System.out.println(Arrays.toString(array));            
        BinaryInsertSort.Sort(array);
    }
}
复制代码

 

 输出截图:

算法分析:

   1)时间复杂度:

   折半插入排序比直接插入排序明显减少了关键字之间的比较次数,但是移动次数是没有改变。所以,折半插入排序和插入排序的时间复杂度相同都是O(N^2),在减少了比较次数方面它确实相当优秀,所以该算法仍然比直接插入排序好。

   2)空间复杂度:

   折半插入排序和插入排序一样只需要一个多余的缓存数据单元来放第 i 个元素,所以空间复杂度是O(1),因为排序前2个相等的数在序列的前后位置顺序和排序后它们两个的前后位置顺序相同,所以它是一个稳定排序。 

 

转载于:https://my.oschina.net/u/1170022/blog/138473

相关文章:

  • 2013上半年总结于展望
  • 统一异常处理
  • CSS3
  • ASCII对照表
  • 位运算的巧妙应用
  • JVM实用参数(七)CMS收集器
  • 用jQuery实现鼠标在table上移动进行样式变化
  • CSS魔法堂:Absolute Positioning就这个样
  • (转)平衡树
  • FROONT – 超棒的可视化响应式网页设计工具
  • Redis 基本操作(一)
  • grub rescue fix
  • 【转载】Oracle中的各种NAME
  • 非类型的类模板参数
  • Spring IOC理解
  • docker python 配置
  • ESLint简单操作
  • java取消线程实例
  • JDK9: 集成 Jshell 和 Maven 项目.
  • Linux Process Manage
  • Python socket服务器端、客户端传送信息
  • Python学习之路16-使用API
  • React-Native - 收藏集 - 掘金
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • Selenium实战教程系列(二)---元素定位
  • 测试开发系类之接口自动化测试
  • 力扣(LeetCode)56
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 前端面试之CSS3新特性
  • 前嗅ForeSpider采集配置界面介绍
  • 树莓派 - 使用须知
  • 译有关态射的一切
  • 从如何停掉 Promise 链说起
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #QT(智能家居界面-界面切换)
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (4)logging(日志模块)
  • (Matlab)使用竞争神经网络实现数据聚类
  • (python)数据结构---字典
  • (强烈推荐)移动端音视频从零到上手(上)
  • (转)德国人的记事本
  • ./configure,make,make install的作用
  • .net FrameWork简介,数组,枚举
  • .Net FrameWork总结
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘
  • @RequestParam @RequestBody @PathVariable 等参数绑定注解详解
  • @SuppressWarnings(unchecked)代码的作用
  • [ solr入门 ] - 利用solrJ进行检索
  • [Android]常见的数据传递方式
  • [BZOJ5125]小Q的书架(决策单调性+分治DP+树状数组)
  • [CareerCup] 12.3 Test Move Method in a Chess Game 测试象棋游戏中的移动方法
  • [go] 策略模式