基本思想:

  折半插入算法是对直接插入排序算法的改进,排序原理同直接插入算法:

  把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素;排序过程即每次从无序表中取出第一个元素,将它插入到有序表中,使之成为新的有序表,重复n-1次完成整个排序过程。

  与直接插入算法的区别在于:在有序表中寻找待排序数据的正确位置时,使用了折半查找/二分查找。

 实例:

  (参考直接插入排序算法:http://www.cnblogs.com/snowcan/p/6244128.html)

 与  直接插入算法  相区别的代码(二分查找):

  1. /**
  2. * 寻找temp插入有序列表的正确位置,使用二分查找法
  3. */
  4. while(low <= high){
  5. /**
  6. * 有序数组的中间坐标,此时用于二分查找,减少查找次数
  7. */
  8. int mid = (low+high)/2;
  9. /**
  10. * 若有序数组的中间元素大于待排序元素,则有序序列向中间元素之前搜索,否则向后搜索
  11. */
  12. if(a[mid]>temp){
  13. high = mid-1;
  14. }else{
  15. low = mid+1;
  16. }
  17. }

 Java实现: 

  1. package sort;
  2. /**
  3. * 折半插入排序 的实现
  4. * 稳定算法
  5. * @author 那一季的银杏叶
  6. *
  7. */
  8. public class InsertSort {
  9. public static void main(String[] args) {
  10. // TODO Auto-generated method stub
  11. int a[] = {3,1,5,7,2,4,9,6};
  12. new InsertSort().binaryInsertSort(a);
  13. }
  14.  
  15. /**
  16. * 折半插入排序算法的实现
  17. * @param a
  18. */
  19. private void binaryInsertSort(int[] a) {
  20. // TODO Auto-generated method stub
  21. System.out.println("———————————————————折半插入排序算法—————————————————————");
  22. int n = a.length;
  23. int i,j;
  24. for(i=1;i<n;i++){
  25. /**
  26. * temp为本次循环待插入有序列表中的数
  27. */
  28. int temp = a[i];
  29. int low=0;
  30. int high=i-1;
  31. /**
  32. * 寻找temp插入有序列表的正确位置,使用二分查找法
  33. */
  34. while(low <= high){
  35. /**
  36. * 有序数组的中间坐标,此时用于二分查找,减少查找次数
  37. */
  38. int mid = (low+high)/2;
  39. /**
  40. * 若有序数组的中间元素大于待排序元素,则有序序列向中间元素之前搜索,否则向后搜索
  41. */
  42. if(a[mid]>temp){
  43. high = mid-1;
  44. }else{
  45. low = mid+1;
  46. }
  47. }
  48.  
  49. for(j=i-1;j>=low;j--){
  50. /**
  51. * 元素后移,为插入temp做准备
  52. */
  53. a[j+1] = a[j];
  54. }
  55. /**
  56. * 插入temp
  57. */
  58. a[low] = temp;
  59. /**
  60. * 打印每次循环的结果
  61. */
  62. print(a,n,i);
  63. }
  64. /**
  65. * 打印排序结果
  66. */
  67. printResult(a,n);
  68. }
  69. /**
  70. * 打印排序的最终结果
  71. * @param a
  72. * @param n
  73. */
  74. private void printResult(int[] a, int n){
  75. System.out.print("最终排序结果:");
  76. for(int j=0;j<n;j++){
  77. System.out.print(" "+a[j]);
  78. }
  79. System.out.println();
  80. }
  81. /**
  82. * 打印排序的每次循环的结果
  83. * @param a
  84. * @param n
  85. * @param i
  86. */
  87. private void print(int[] a, int n, int i) {
  88. // TODO Auto-generated method stub
  89. System.out.print("第"+i+"次:");
  90. for(int j=0;j<n;j++){
  91. System.out.print(" "+a[j]);
  92. }
  93. System.out.println();
  94. }
  95. }

 运行结果展示:

 (本文仅供学习交流,如有更好的思路,欢迎留下意见供大家探讨学习~)

排序系列 之 折半插入排序算法 —— Java实现的更多相关文章

  1. 排序系列 之 直接插入排序算法 —— Java实现

    直接插入排序算法 基本思想: 把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素:排序过程即每次从无序表中取出第一个元素,将它插入到有序表中,使之成为新的 ...

  2. 【java集合框架源码剖析系列】java源码剖析之java集合中的折半插入排序算法

    注:关于排序算法,博主写过[数据结构排序算法系列]数据结构八大排序算法,基本上把所有的排序算法都详细的讲解过,而之所以单独将java集合中的排序算法拿出来讲解,是因为在阿里巴巴内推面试的时候面试官问过 ...

  3. 排序算法系列:插入排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)

    在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 我总结一个清晰不罗嗦版: 原理: 和选择排序类似的是也分成“已排序”部分,和“未排 ...

  4. 两种插入排序算法java实现

    两种方法都编译运行通过,可以当做排序类直接使用. 折半插入排序: public class Sort1 { public static void main(String[] args) { Inser ...

  5. 插入排序算法 Java实现

    插入排序算法是算法排序中的一种: 该算法是假设已有序列是有序序列,从首元素(首元素为单个元素,肯定是有序的...)开始分析,对其他元素的位置进行有序的确定: 以算法为例: public class I ...

  6. 折半插入排序算法的C++实现

    折半插入排序思想和直接插入排序类似. 1)找到插入位置: 2)依次后移正确位置及后面的元素. 区别是查找插入位置的方法不同. 折半插入排序使用的折半查找法在一个已经有序的序列中找到查找位置. 注意,折 ...

  7. 【排序算法】快速插入排序算法 Java实现

    基本思想 每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部插入完成. 设数组为a[0...n-1] 初始时,a[0]自成一个有序区,无序区为a[1...n-1] ...

  8. 插入排序算法Java实现

    一. 算法描述 插入即表示将一个新的数据插入到一个有序数组中,并继续保持有序.例如有一个长度为N的无序数组,进行N-1次的插入即能完成排序:第一次,数组第1个数认为是有序的数组,将数组第二个元素插入仅 ...

  9. 插入排序算法java

    转自https://blog.csdn.net/jianyuerensheng/article/details/51254415 1.基本思想 直接插入排序的基本操作是将一个记录插入到已经排好的有序表 ...

随机推荐

  1. Excel数据批量导入到数据库

    1.今天做批量导入网上找了个例子,改了改,运行起来了.用POI实现Excel的读取,需要jar包. 2.ReadExcel.java读取数据 /** * */ package com.b510.exc ...

  2. iframe详细的使用

    谷歌火狐和ie是有区别的谷歌需要服务器,为了更安全 获取内容的时候, 正常渲染没问题获取内容var oIframe = document.getElementById('iframe'); oIfra ...

  3. nodejs解决找不到express命令的问题

    一般的书或者教程上的安装步骤是:(需要是-g,即全局安装) npm install -g express //全局安装 而我们应该多多关注下express的文档,github地址:https://gi ...

  4. 20145236 GDB调试汇编堆栈过程分析

    GDB调试汇编堆栈过程分析 首先需要输入sudo apt-get install libc6-dev-i386安装一个库才能产生汇编代码,然后输入gcc - g example.c -o exampl ...

  5. 转,Oracle中关于处理小数点位数的几个函数,取小数位数,Oracle查询函数

    关于处理小数点位数的几个oracle函数() 1. 取四舍五入的几位小数 select round(1.2345, 3) from dual; 结果:1.235 2. 保留两位小数,只舍 select ...

  6. Linux内核分析课程总结

    Linux内核分析课程总结 By 20135203齐岳 知识梳理 (思维导图地址http://mindmap.4ye.me/mkxM0cFh/1) 从start _ kernel构造一个新的Linux ...

  7. java selenium (四) 使用浏览器调试工具

    在基于UI元素的自动化测试中, 无论是桌面的UI自动化测试,还是Web的UI自动化测试.   首先我们需要查找和识别UI元素. 在基于Web UI 自动化测试中, 测试人员需要了解HTML, CSS和 ...

  8. Ionic 的 ng-class 在聊天功能上面的巧妙运用

    很多人在问我是ionic好呢?还是react好呢? 其实我只想告诉你去看文档啊,不用用怎么知道哪个合适呢? 嘿嘿但是真的这么问的时候我也不会这么回答的,那岂不是太张狂了哈哈哈 react我确实没有用过 ...

  9. AsyncTask

    package com.gg.test; import java.io.IOException; import org.apache.http.HttpResponse;import org.apac ...

  10. 通过淘宝IP地址库获取IP位置

    地址:http://ip.taobao.com/ 提供的服务包括: 1. 根据用户提供的IP地址,快速查询出该IP地址所在的地理信息和地理相关的信息,包括国家.省.市和运营商. 2. 用户可以根据自己 ...