前面讲了直接插入排序,下面来讲讲二分插入排序。
二分插入排序也是插入排序的一种,和直接插入排序不同的是比较的方法不同。直接插入排序是将第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])。二分插入排序是稳定的排序算法。
转载自
开发者的天空
分享到:
相关推荐
算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...
Java经典算法 ,各种排序算法 老掉牙 河內塔 費式數列 巴斯卡三角形 三色棋 老鼠走迷官(一) 老鼠走迷官(二) 騎士走棋盤 八個皇后 八枚銀幣 生命遊戲 字串核對 雙色、三色河內塔 背包問題(Knapsack...
该工具包含有Java一些比较常见的排序算法和查找算法。 排序算法包括:冒泡排序、选择排序 、插入排序、希尔排序、快速排序、归并排序、基数排序(桶排序) 查找算法包括:线性查找、二分查找、插值查询、斐波那契...
基础算法Java版本 --持续更更新中 注重算法思想和算法的优化过程并有详细的注释 排序算法 简单排序 选择排序 插入排序 字典排序 复杂排序 归并排序 快速排序 双基准快速排序 三路快速排序 堆排序 索引堆排序(堆...
主要为大家详细介绍了Java经典排序算法之二分插入排序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
一些基本的排序,归并,插入,选择,冒泡,二分查找
排序方法Shell 排序法 - 改良的插入排序 Shaker 排序法 - 改良的气泡排序 Heap 排序法 - 改良的选择排序 快速排序法(一) 快速排序法(二) 快速排序法(三) 合并排序法 基数排序法 循序搜寻法(使用卫兵...
算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...
冒泡排序、快速排序、归并排序、插入排序、选择排序、二分排序、希尔排序
* 它常用在较复杂的排序算法后阶段 * 使用:数据量较小、基本有序的情况一般选择 插入排序 描述:选择排序 * 特点:优化了冒泡排序,交换次数减少到O(N),比较次数依然为O(N*N) 描述:二分查找发 核心算法 *...
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 自底...
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 ...
查找算法:基本、二分、插值、分块 排序算法:冒泡排序、选择排序、插入排序、快速排序
相关主题有:并查集算法,二分查找,栈,队列,背包,插入排序,选择排序,希尔排序,快速排序, 三切分快排,归并排序,堆排序,二分堆,二分查找树,红黑树,链表,线性哈希表,Graham扫描,kd树。 算法(二)...
算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...
Shell 排序法 - 改良的插入排序 Shaker 排序法 - 改良的氣泡排序 Heap 排序法 - 改良的選擇排序 快速排序法(一) 快速排序法(二) 快速排序法(三) 合併排序法 基數排序法 循序搜尋法(使用衛兵) 二分...
稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、...插入排序、快速排序、归并排序、希尔排序、基数排序(桶排序)、堆排序、排序速度分析、二分查找、插值查找、斐波那契查找、散列、哈希表、...
• Shell 排序法 - 改良的插入排序 • Shaker 排序法 - 改良的气泡排序 • Heap 排序法 - 改良的选择排序 • 快速排序法(一) • 快速排序法(二) • 快速排序法(三) • 合并排序法 • 基数排序法 搜寻...