一、折半插入排序(二分插入排序)

将直接插入排序中寻找A[i]的插入位置的方法改为採用折半比較,就可以得到折半插入排序算法。在处理A[i]时,A[0]……A[i-1]已经按关键码值排好序。所谓折半比較,就是在插入A[i]时,取A[i-1/2]的关键码值与A[i]的关键码值进行比較,假设A[i]的关键码值小于A[i-1/2]的关键码值。则说明A[i]仅仅能插入A[0]到A[i-1/2]之间。故能够在A[0]到A[i-1/2-1]之间继续使用折半比較;否则仅仅能插入A[i-1/2]到A[i-1]之间。故能够在A[i-1/2+1]到A[i-1]之间继续使用折半比較。如此担负,直到最后能够确定插入的位置为止。

一般在A[k]和A[r]之间採用折半。当中间结点为A[k+r/2]。经过一次比較就可以排除一半纪录,把可能插入的区间减小了一半,故称为折半。运行折半插入排序的前提是文件纪录必须按顺序存储。


二、算法原理

折半插入排序的算法思想:

算法的基本过程:
(1)计算 0 ~ i-1 的中间点。用 i 索引处的元素与中间值进行比較。假设 i 索引处的元素大,说明要插入的这个元素应该在中间值和刚增加i索引之间。反之。就是在刚開始的位置 到中间值的位置,这样非常easy的完毕了折半;
(2)在对应的半个范围里面找插入的位置时。不断的用(1)步骤缩小范围。不停的折半。范围依次缩小为 1/2 1/4 1/8 .......高速的确定出第 i 个元素要插在什么地方。
(3)确定位置之后。将整个序列后移,并将元素插入到对应位置。








三、代码实现


public class BinarySort {
public static void binarySort(int[] source) {
int i, j;
int high, low, mid;
int temp;
for (i = 1; i < source.length; i++) {
// 查找区上界
low = 0;
// 查找区下界
high = i - 1;
//将当前待插入记录保存在暂时变量中
temp = source[i];
while (low <= high) {
// 找出中间值
// mid = (low + high) / 2;
mid = (low + high) >> 1;
//假设待插入记录比中间记录小
if (temp<source[mid] ) {
// 插入点在低半区
high = mid - 1;
} else {
// 插入点在高半区
low = mid + 1;
}
}
//将前面全部大于当前待插入记录的记录后移
for (j = i - 1; j >=low; j--) {
source[j + 1] = source[j];
}
//将待插入记录回填到正确位置.
source[low] = temp;
System.out.print("第" + i + "趟排序:");
printArray(source);
}
} private static void printArray(int[] source) {
for (int i = 0; i < source.length; i++) {
System.out.print("\t" + source[i]);
}
System.out.println();
} public static void main(String[] args) {
int source[] = new int[] { 12, 15, 9, 14, 4, 18, 23, 6 };
System.out.print("初始keyword:");
printArray(source);
System.out.println(""); binarySort(source); System.out.print("\n\n排序后结果:");
printArray(source);
}
}

四、执行结果:

初始keyword:	12	15	9	14	4	18	23	6

第1趟排序:	12	15	9	14	4	18	23	6
第2趟排序: 9 12 15 14 4 18 23 6
第3趟排序: 9 12 14 15 4 18 23 6
第4趟排序: 4 9 12 14 15 18 23 6
第5趟排序: 4 9 12 14 15 18 23 6
第6趟排序: 4 9 12 14 15 18 23 6
第7趟排序: 4 6 9 12 14 15 18 23 排序后结果: 4 6 9 12 14 15 18 23

==================================================================================================

  作者:欧阳鹏  欢迎转载,与人分享是进步的源泉!

  转载请保留原文地址:http://blog.csdn.net/ouyang_peng

==================================================================================================



版权声明:本文欧阳鹏原创文章,欢迎转载,转载请注明出处http://blog.csdn.net/ouyang_peng

矿Java开发学习之旅------&gt;Java排序算法经典的二分法插入排序的更多相关文章

  1. 我的Java开发学习之旅------>解惑Java进行三目运算时的自动类型转换

    今天看到两个面试题,居然都做错了.通过这两个面试题,也加深对三目运算是的自动类型转换的理解. 题目1.以下代码输出结果是(). public class Test { public static vo ...

  2. 我的Java开发学习之旅------&gt;Java经典排序算法之归并排序

    一.归并排序 归并排序是建立在归并操作上的一种有效的排序算法,该算法是採用分治法(Divide and Conquer)的一个很典型的应用.将已有序的子序列合并,得到全然有序的序列.即先使每一个子序列 ...

  3. 我的Java开发学习之旅------>Java 格式化类(java.util.Formatter)基本用法

    本文参考: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html http://www.blogjava.net/ ...

  4. 我的Java开发学习之旅------>工具类:将播放器的进度值转换成相应的时间格式

    在我的博客<我的Java开发学习之旅------>Java 格式化类(java.util.Formatter)基本用法,地址:http://blog.csdn.net/ouyang_pen ...

  5. 我的Java开发学习之旅------>在Dos环境下Java内部类的编译和运行

    习惯了在IDE工具上进行代码编写,连最基本的Javac命令和Java命令都忘记的差不多了,今天对一个Java内部类进行编译和运行的时候,就出糗了.IDE是把双刃剑,它可以什么都帮你做了,你只要敲几行代 ...

  6. 我的Java开发学习之旅------>Java NIO 报java.nio.charset.MalformedInputException: Input length = 1异常

    今天在使用Java NIO的Channel和Buffer进行文件操作时候,报了java.nio.charset.MalformedInputException: Input length = 1异常, ...

  7. 我的Java开发学习之旅------>Java使用ObjectOutputStream和ObjectInputStream序列号对象报java.io.EOFException异常的解决方法

    今天用ObjectOutputStream和ObjectInputStream进行对象序列化话操作的时候,报了java.io.EOFException异常. 异常代码如下: java.io.EOFEx ...

  8. 我的Java开发学习之旅------>工具类:Java获取字符串和文件进行MD5值

    ps:这几天本人用百度云盘秒传了几部大片到云盘上,几个G的文件瞬秒竟然显示"上传成功"!这真让我目瞪口呆,要是这样的话,那得多快的网速,这绝对是不可能的,也许这仅是个假象.百度了一 ...

  9. 我的Java开发学习之旅------>工具类:Java使用正则表达式分离出字符串中的中文和英文

    今天看到一个工具类使用正则表达式将一大段字符串中的中文和英文都分离出来了,在此记录一下,读者可以收藏! import java.util.ArrayList; import java.util.Col ...

随机推荐

  1. zynq修改ramdisk文件系统

    ⑴ 挂载 Ramdisk新建目录 tmp, 并将 uramdisk.image.gz 拷贝至该目录$ cd <WORKDIR>/Filesystem$ mkdir tmp$ cp uram ...

  2. client产生CLOSE_WAIT状态的解决方式

    现象 生产环境和測试环境都发现有个外围应用通过搜索服务调用搜索引擎时.偶尔会出现大量的訪问超时的问题,通过例如以下方式进行分析排查: l 首先是拿到搜索服务的JavaCore.发现其堵在HttpCli ...

  3. [Nuxt] Use Vuex Actions to Delete Data from APIs in Nuxt and Vue.js

    You'll begin to notice as you build out your actions in Vuex, many of them will look quite similar. ...

  4. FastSocket学习笔记~RPC的思想,面向对象的灵活

    首先非常感谢这位来自新浪的老兄,它开发的这个FastSocket非常不错,先不说性能如何,单说它的使用方式和理念上就很让人赞口,从宏观上看,它更像是一种远程过程的调用RPC,即服务器公开一些命令,供客 ...

  5. C# .NET Socket

    C# .NET Socket 简单实用框架 背景: 首先向各位前辈,大哥哥小姐姐问一声好~ 这是我第一次写博客,目前为一个即将步入大四的学生,上学期在一家公司实习了半年,后期发现没有动力,而且由于薪水 ...

  6. 该扩展程序未列在 Chrome 网上应用店中,并可能是在您不知情的情况下添加的

    "chrome扩展程序无法启用"的解决方案 http://www.cnplugins.com/tool/installpluginfix.html win10家庭版没有组策略怎么办? https:// ...

  7. Perl自动释放Licence启动Verdi

    Perl自动释放Licence启动Verdi 在工作中,遇到verdi的License不够的情况,某些人占用了多个License,为及时获得一个可用的License,写了一个perl来kill运行时间 ...

  8. maven pom.xml基本使用方法

    pom.xml文件是Maven进行工作的主要配置文件.在这个文件里我们能够配置Maven项目的groupId.artifactId和version等Maven项目必须的元素:能够配置Maven项目须要 ...

  9. 上传文件是常要处理的事情,使用ajaxFileUpload.js处理比较方便,这里的ajaxFileUpload.js文件修改过的,

    上传文件是常要处理的事情,使用ajaxFileUpload.js处理比较方便,这里的ajaxFileUpload.js文件修改过的, Html部分 <input type="file& ...

  10. 解决win7系统不支持16位实模式汇编程序DOS执行的问题

    这学期学习了汇编,在自己电脑上发现,win7的dos不支持16位实模式. 对编程来说,不能执行程序是致命的. 在经过网上搜集资料后,得到一种解决的方法--使用dosbox软件执行 dosbox简单说, ...