[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. 前言 本系列文章将介绍一些常用的排序算法.排序是一个非常常见的应用场景,也是开发岗位面试必问的一道面试题,有人说,如果一个企业招聘开发人员的题目中没有排序算法题,那说明这个企业不是一个" ...
随机推荐
- vue 同一个子组件,两次赋值不同,dom不更新
转自:https://blog.csdn.net/WO_JIAMIFENG/article/details/115250918 <div :key="inputkey"> ...
- DataRow[]数组转换为DataTable
DataRow[] drData=DataTable.Select("....."); DataTable dtNew=drData.CopyToDataTable(); 注:Da ...
- Python人脸识别——电脑摄像头检测人脸与眼睛
##10 电脑摄像头检测人脸与眼睛 import cv2 #检测图片 def detect(frame): #灰度化图片,减少运算量 #img = cv2.cvtColor(frame ...
- springboot 日志处理
引言 springboot框架集成logback日志 logback是由log4j创始人设计的又一个开源日志组件.目前,logback分为三个模块:logback-core,logback-class ...
- window10下,命令行与端口
netstat -ano 查看端口情况 tasklist|findstr "9220" 通过PID号"9220"查看对应端口被什么进程占用了 netstat - ...
- 关于uniapp图片默认的空隙处理方案
display:block; 或者 display:flex;
- 通过网页或者移动设备链接跳转qq(tim)添加好友(群)
首先需要去qq群官方,然后点记加群组件,然后选择群,复制对应的代码即可 登录到QQ群官网 点击加群组件 选择群,选择网页还是移动设备 复制代码 示例: <html> <head> ...
- centos7所有用户循环登录
1 使用快捷键Ctrl+Alt+F2进入命令终端 2 输入账号密码 3 输入 /usr/bin/sudo 4 输入 startx 那种单用户,改配置的试了没有用
- ES2016-ES2020
参考:https://zhuanlan.zhihu.com/p/59096242 备注:可以使用ES6取代的10个Lodash特性 https://www.w3cplus.com/javascript ...
- JsonResult向前端返回值,报错500
1,问题原因 因为返回信息为json对象,我在controller方法所在的入口类上,添加的注解是:@Controller 而@Controller是不适合返回json内容的 2,解决方法 方法一:不 ...