基本思想:

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

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

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

 实例:

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

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

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

 Java实现: 

package sort;
/**
* 折半插入排序 的实现
* 稳定算法
* @author 那一季的银杏叶
*
*/
public class InsertSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
int a[] = {3,1,5,7,2,4,9,6};
new InsertSort().binaryInsertSort(a);
} /**
* 折半插入排序算法的实现
* @param a
*/
private void binaryInsertSort(int[] a) {
// TODO Auto-generated method stub
System.out.println("———————————————————折半插入排序算法—————————————————————");
int n = a.length;
int i,j;
for(i=1;i<n;i++){
/**
* temp为本次循环待插入有序列表中的数
*/
int temp = a[i];
int low=0;
int high=i-1;
/**
* 寻找temp插入有序列表的正确位置,使用二分查找法
*/
while(low <= high){
/**
* 有序数组的中间坐标,此时用于二分查找,减少查找次数
*/
int mid = (low+high)/2;
/**
* 若有序数组的中间元素大于待排序元素,则有序序列向中间元素之前搜索,否则向后搜索
*/
if(a[mid]>temp){
high = mid-1;
}else{
low = mid+1;
}
} for(j=i-1;j>=low;j--){
/**
* 元素后移,为插入temp做准备
*/
a[j+1] = a[j];
}
/**
* 插入temp
*/
a[low] = temp;
/**
* 打印每次循环的结果
*/
print(a,n,i);
}
/**
* 打印排序结果
*/
printResult(a,n);
}
/**
* 打印排序的最终结果
* @param a
* @param n
*/
private void printResult(int[] a, int n){
System.out.print("最终排序结果:");
for(int j=0;j<n;j++){
System.out.print(" "+a[j]);
}
System.out.println();
}
/**
* 打印排序的每次循环的结果
* @param a
* @param n
* @param i
*/
private void print(int[] a, int n, int i) {
// TODO Auto-generated method stub
System.out.print("第"+i+"次:");
for(int j=0;j<n;j++){
System.out.print(" "+a[j]);
}
System.out.println();
}
}

 运行结果展示:

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

排序系列 之 折半插入排序算法 —— 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. C # 数据绑定(1)——将DataTabel的data添加ListView

    文/嶽永鹏 目标界面: 功能:通过响应UI Textbox 的值向ListView 绑定新添加的纪录. UI XAML 代码 <Grid Margin="5"> < ...

  2. Win服务器常用批处理脚本

    oracle数据库备份 先导出数据库,然后执行压缩,将源文件删除,保留压缩文件 exp crm/crm@orcl file=G:\数据库备份\CRM\CRM%DATE%.dmp owner=crm&q ...

  3. ExtJs 进度条(轮询)

    客户端代码: Ext.onReady(function () { Ext.get('mb').on('click', function () { Ext.Ajax.request({ url: roo ...

  4. css实现强制不换行/自动换行/强制换行

    在我们日常的编码中经常会遇到这段文字不可以换行,或者自动换行的需求.虽然这个功能在我们平时很常见但是我相信大家一定不会可以的去记住它吧(至少小月是很懒惰的从来是用什么查什么 ♦ 嘻嘻...).今天我们 ...

  5. 文顶顶iOS开发博客链接整理及部分项目源代码下载

    文顶顶iOS开发博客链接整理及部分项目源代码下载   网上的iOS开发的教程很多,但是像cnblogs博主文顶顶的博客这样内容图文并茂,代码齐全,示例经典,原理也有阐述,覆盖面宽广,自成系统的系列教程 ...

  6. 在windows 10中使用pip安装psutil 4.3.0

    环境版本:windows + python 2.7/3.5共存 使用的python是使用exe安装的,默认已经有pip并确保PATH设置正确,默认安装psutil 4.3.0 1:使用cmd安装2.7 ...

  7. QT 做软件盘

    最近搞了一个组织细胞脱水机项目,当然,对于国内的项目都是仿来仿去的,我们也不例外,开启被仿机器后,第一个看到的界面就是用户登录界面,需要输入中文,作为一个程序员,我的第一反应就是我需要采用什么用的框架 ...

  8. C++变量初始化问题

    初始化和赋值的区别 在C++中,变量初始化和赋值操作符是两个完全不同的概念. 初始化不是赋值,初始化的含义是创建变量分配存储空间时为其赋一个初始值,而赋值的含义是把内存空间的当前值擦除,用一个新值代替 ...

  9. HDU 1712 分组背包

    ACboy needs your help Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  10. java格式化时间格式

    System.out.println("Hello World!"); SimpleDateFormat format = new SimpleDateFormat( " ...