[Java]排序算法>插入排序>【折半插入排序】(O(N*N)/稳定/N较大/无序/顺序存储)
1 折半插入排序
1.1 算法思想
相比于【直接插入排序】:采用“顺序查找法”查找当前记录在已排好序的序列中的插入位置,
折半插入排序利用“折半查找法”快速查出目标插入位置,再针对性滴移动元素,实现插入。
1.2 算法特征
- 属于【插入排序】
- 适用于【稳定性】:稳定
- 适用于【规模N】:较大
- 适用于【有序性】:无序
- 适用于【存储结构】:仅顺序存储结构(链式存储难以实现)
- 【时间复杂度】:O(NlogN) (最好) / O(NN) (平均) / O(NN) (最坏)
- 【空间复杂度】:O(1) (最好/平均/最坏)
- 相关口诀:【二希堆快】顺序存,【插冒二选】时N方
1.3 算法实现
import java.util.Arrays;
public class BinInsertSort {
public static int [] binInsertSort(int []array){//折半插入排序
int [] resultArray = Arrays.copyOfRange(array, 0, array.length);
int inertingValue;
for(int i=1;i<resultArray.length;i++){
inertingValue = resultArray[i];
if(resultArray[i-1] > inertingValue){
int low = 0;
int high = i-1;
while(low<=high){
int mid = (low+high)/2;
if(resultArray[mid]>inertingValue)
high = mid-1;
else if(resultArray[mid]<inertingValue)
low = mid+1;
}
//查找结束后,low = high+1 即 应当插入的目标位置
//后移 下标∈[low, i-1]的元素
for(int k=i;k>low;k--){//k∈[low+1 , i]
resultArray[k] = resultArray[k-1];
}
resultArray[low] = inertingValue;
}
}
return resultArray;
}
}

1.4 测试实现
import java.util.Scanner;
public class Main {
public static void print(int[] array){
if(array==null || array.length<1){
return;
}
for(int i=0;i<array.length-1;i++){
System.out.print(array[i]+" ");
}
System.out.println(array[array.length-1]);
}
public static void main(String[] args) {
//1 输入 一组 乱序的数值 数组
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
String [] strValues = input.trim().split(" ");
int [] array = new int[strValues.length];
for(int i=0,len=strValues.length;i<len;i++){
array[i] = Integer.valueOf(strValues[i]).intValue();//假定所有输入均为合规的整型数值
}
// print(array);// test - 输出 所输入的数据
//2 排序
int [] sortedArray = BinInsertSort.binInsertSort(array);
//3 输出
print(sortedArray);
}
}

1.5 参考文献
- 《数据结构(C语言-第2版-严蔚敏 吴伟民 著)》:Page238
[Java]排序算法>插入排序>【折半插入排序】(O(N*N)/稳定/N较大/无序/顺序存储)的更多相关文章
- Java常见排序算法之折半插入排序
在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...
- 排序算法之折半插入排序的思想以及Java实现
1 基本思想 折半插入排序(binary insertion sort)的基本原理与直接插入排序相同,不同之处在于,确定当前记录在前面有序子数组中的位置时,直接插入排序是采用顺序查找的方法,而折半插入 ...
- [排序算法] 直接/折半插入排序 (C++)
插入排序解释 插入排序很好理解,其步骤是 :先将第一个数据元素看作是一个有序序列,后面的 n-1 个数据元素看作是未排序序列.对后面未排序序列中的第一个数据元素在这个有序序列中进行从后往前扫描,找到合 ...
- java排序算法(七):折半插入排序
java排序算法(七):折半插入排序 折半插入排序法又称为二分插入排序法,是直接插入排序法的改良版本,也需要执行i-1趟插入.不同之处在于第i趟插入.先找出第i+1个元素应该插入的位置.假设前i个数据 ...
- Java常见排序算法之直接插入排序
在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...
- java排序算法(六):直接插入排序
java排序算法(六):直接插入排序 直接插入排序的基本操作就是将待的数据元素按其关键字的大小插入到前面的有序序列中 直接插入排序时间效率并不高,如果在最坏的情况下,所有元素的比较次数的总和为(0+1 ...
- 排序算法之直接插入排序Java实现
排序算法之直接插入排序 舞蹈演示排序: 冒泡排序: http://t.cn/hrf58M 希尔排序:http://t.cn/hrosvb 选择排序:http://t.cn/hros6e 插入排序: ...
- 我的Java开发学习之旅------>Java经典排序算法之二分插入排序
一.折半插入排序(二分插入排序) 将直接插入排序中寻找A[i]的插入位置的方法改为采用折半比较,即可得到折半插入排序算法.在处理A[i]时,A[0]--A[i-1]已经按关键码值排好序.所谓折半比较, ...
- 矿Java开发学习之旅------>Java排序算法经典的二分法插入排序
一.折半插入排序(二分插入排序) 将直接插入排序中寻找A[i]的插入位置的方法改为採用折半比較,就可以得到折半插入排序算法.在处理A[i]时,A[0]--A[i-1]已经按关键码值排好序.所谓折半比較 ...
- 算法相关——Java排序算法之插入排序(四)
0. 前言 本系列文章将介绍一些常用的排序算法.排序是一个非常常见的应用场景,也是开发岗位面试必问的一道面试题,有人说,如果一个企业招聘开发人员的题目中没有排序算法题,那说明这个企业不是一个" ...
随机推荐
- What is the Best Python IDE for Data Science?
Created by Guido van Rossum, Python was first released back in 1991. The interpreted high-level prog ...
- [fiddler的使用]添加常用字段(请求耗时,客户端请求时间,IP地址)
1. /* 显示请求耗时 */ function BeginRequestTime(oS: Session) { if (oS.Timers != null) { return oS.Timers.C ...
- 前端上传获取excel文件后,如何读取excel文件的内容
1.安装xlsx npm install xlsx --save-dev 2.引入xlsx并封装读取excel方法 import * as XLSX from "xlsx"; /* ...
- JS笔记(二):数据类型
镇楼图 Pixiv:torino 三.数据类型 原始类型 原始类型像是string.symbol.number之类的都只能存储原子值,而不能像对象一样随意扩展.但是为了提供额外功能,采取了轻量的对象包 ...
- IDEA中maven项目右侧maven图标不见了
右侧maven图标没有了 解决方法:双击shift(或者点击help-->Find Action) 打开搜索功能 ---> 搜素Maven Project--->选择Add Mave ...
- linux 命令下载文件
系统 ubuntu :若提示没有找到命令 请自行下截安装 sz 命令发送文件到本地:# sz filename rz命令本地上传文件到服务器:# rz执行该命令后,在弹出框中选择要上传的文件即可.
- logging 模块详解
日志记录函数以它们用来跟踪的事件的级别或严重性命名.下面描述了标准级别及其适用性(从高到低的顺序) 日志等级(level) 描述DEBUG 最详细的日志信息,典型应用场景是 问题诊断INFO 信息详细 ...
- apache axis2 生成客户端实体类
打开控制台,cd至压缩包(见下方网盘链接)的bin目录下执行如下命令.只用到了axis2-1.4.1-bin.zip. war目前不知道有什么用,因为资源不好找,留着备用吧 WSDL2Java -ur ...
- 百度自定义底图(瓦片图)升级 HTTPS
本文地址:https://www.cnblogs.com/veinyin/p/14338414.html 记录一下开发中遇到的问题与解决方案 使用 Leaflet 开发,设计为了美观采用百度自定义底图 ...
- 我在迁移我的IDEA的项目、模块等东西的过程中发生过的一部分问题的我的一部分的记录以及我的解决方案如下
使用idea2019阶段报的一些错: 1.'xxxServlet' is not assignable to 'javax.servlet.Servlet' 解决方案:把tomcat加入classpt ...