`
developersky
  • 浏览: 7942 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
社区版块
存档分类
最新评论

常用排序算法的Java实现(2)-二分插入排序

阅读更多
前面讲了直接插入排序,下面来讲讲二分插入排序。
二分插入排序也是插入排序的一种,和直接插入排序不同的是比较的方法不同。直接插入排序是将第i个与前面i-1个逐个比较,找到要插入的位置。最好的情况是只比较一次,最坏的情况是比较i-1次。二分插入排序采用二分法来减少最坏情况下的比较次数。例如:
有6个记录,前5个已排序的基础上,对第6个记录排序。
[3,5,8,12,23], 19
前面有5个已经排序的,中间位置是第3个。将第6个与第3个进行比较,19 > 8,说明19应该排在8后面,但是具体的位置还没有确定,还需要继续进行比较。在后面的两个(第4个和第5个),我们取中间位置为第4个。 19>12,说明19应该排在12后面。再将19和最后面的一个进行比较,19<23,说明19应该排在23的前面,这样我们就确定了19最终的位置。
大家可以看到,在这种情况下,直接插入排序需要比较5次,而二分插入排序只需要比较3次。
下面就是二分插入排序的代码,同样的我们以对整数进行升序排列为例子:
public int[] binSort(int[] source){
                for (int i=0; i<source.length; i++){
                        int left = 0;
                        int right = i-1;
                        while (left <= right){
                                int mid = left + (right - left)/2;
                                if (source[i] > source[mid]){
                                        left = mid + 1;
                                } else {
                                        right = mid - 1;
                                }
                        }
                       
                        int temp = source[i];
                        moveBackward(left, i-1, source);
                        source[left] = temp;
                       
                }
               
                return source;
        }

        /*
         * 将给定数组中指定范围内的所有元素在数组中向后移一个位置。
         */
        private void moveBackward(int from, int to, int[] values){
                if (from < 0)
                        return;
                if (values == null || values.length<2)
                        return;
                if (from >= values.length)
                        return;
                if (to > values.length -2)
                        to = values.length - 2;
                for (int i=to + 1; i>from; i--){
                        values[i] = values[i-1];
                }
        }

二分插入排序的比较次数是O(nlog[sub]2[/sub])。二分插入排序是稳定的排序算法。



转载自  开发者的天空
分享到:
评论

相关推荐

    数据结构与排序算法------通过代码示例,讲解:数据结构和9种排序算法。.zip

    算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...

    JAVA经典算法各种排序算法

    Java经典算法 ,各种排序算法 老掉牙 河內塔 費式數列 巴斯卡三角形 三色棋 老鼠走迷官(一) 老鼠走迷官(二) 騎士走棋盤 八個皇后 八枚銀幣 生命遊戲 字串核對 雙色、三色河內塔 背包問題(Knapsack...

    Java排序算法和查找算法

    该工具包含有Java一些比较常见的排序算法和查找算法。 排序算法包括:冒泡排序、选择排序 、插入排序、希尔排序、快速排序、归并排序、基数排序(桶排序) 查找算法包括:线性查找、二分查找、插值查询、斐波那契...

    algorithm-java:基础算法Java版本 --持续更更新中

    基础算法Java版本 --持续更更新中 注重算法思想和算法的优化过程并有详细的注释 排序算法 简单排序 选择排序 插入排序 字典排序 复杂排序 归并排序 快速排序 双基准快速排序 三路快速排序 堆排序 索引堆排序(堆...

    Java经典排序算法之二分插入排序详解

    主要为大家详细介绍了Java经典排序算法之二分插入排序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    java版本排序算法

    一些基本的排序,归并,插入,选择,冒泡,二分查找

    java开发经典算法

    排序方法Shell 排序法 - 改良的插入排序 Shaker 排序法 - 改良的气泡排序 Heap 排序法 - 改良的选择排序 快速排序法(一) 快速排序法(二) 快速排序法(三) 合并排序法 基数排序法 循序搜寻法(使用卫兵...

    基础算法与数据结构 -- Java 实现.zip

    算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...

    Java实现排序算法

    冒泡排序、快速排序、归并排序、插入排序、选择排序、二分排序、希尔排序

    java排序、冒泡、二分、插入、选择等排序方法分析

    * 它常用在较复杂的排序算法后阶段 * 使用:数据量较小、基本有序的情况一般选择 插入排序 描述:选择排序 * 特点:优化了冒泡排序,交换次数减少到O(N),比较次数依然为O(N*N) 描述:二分查找发 核心算法 *...

    算法-第4版-完整版

    2.1.3 插入排序 157 2.1.4 排序算法的可视化 159 2.1.5 比较两种排序算法 159 2.1.6 希尔排序 162 2.2 归并排序 170 2.2.1 原地归并的抽象方法 170 2.2.2 自顶向下的归并排序 171 2.2.3 自底...

    算法第四版-PDF-网盘链接

     2.1.3 插入排序 157  2.1.4 排序算法的可视化 159  2.1.5 比较两种排序算法 159  2.1.6 希尔排序 162  2.2 归并排序 170  2.2.1 原地归并的抽象方法 170  2.2.2 自顶向下的归并排序 171  ...

    Java程序设计-常见算法

    查找算法:基本、二分、插值、分块 排序算法:冒泡排序、选择排序、插入排序、快速排序

    完整视频-coursera公开课 普林斯顿算法 ⅠⅡ部分

    相关主题有:并查集算法,二分查找,栈,队列,背包,插入排序,选择排序,希尔排序,快速排序, 三切分快排,归并排序,堆排序,二分堆,二分查找树,红黑树,链表,线性哈希表,Graham扫描,kd树。 算法(二)...

    用Java实现基础数据结构,排序算法、经典算法以及leetcode刷题记录.zip

    算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...

    经典算法(C&JAVA实现)

    Shell 排序法 - 改良的插入排序 Shaker 排序法 - 改良的氣泡排序 Heap 排序法 - 改良的選擇排序 快速排序法(一) 快速排序法(二) 快速排序法(三) 合併排序法 基數排序法 循序搜尋法(使用衛兵) 二分...

    【超全!】图解Java数据结构和算法(共195集)【资料+视频+课件+代码+笔记】

    稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、...插入排序、快速排序、归并排序、希尔排序、基数排序(桶排序)、堆排序、排序速度分析、二分查找、插值查找、斐波那契查找、散列、哈希表、...

    经典算法(c&java版)

    • Shell 排序法 - 改良的插入排序 • Shaker 排序法 - 改良的气泡排序 • Heap 排序法 - 改良的选择排序 • 快速排序法(一) • 快速排序法(二) • 快速排序法(三) • 合并排序法 • 基数排序法 搜寻...

Global site tag (gtag.js) - Google Analytics